gdb,如何进入c运行时? crt_c.c 在哪里?
gdb, how to step into c runtime? Where is crt_c.c?
当我进入调试程序时,它说找不到 crt/crt_c.c
文件。我下载了 gcc 6.3.0 的源代码,但是 crt_c.c 在哪里?
另外,我如何在其中找到 printf 和 rand 的源代码?我想在调试器中逐步完成它们。
Ide 是代码块,如果这很重要的话。
编辑:我试图这样做是因为我试图减小可执行文件的大小。直接进入freestanding 给我留下了很多缺失的功能,所以我打算一一研究并替换它们。我试图这样做是为了让我的程序更小更快,并且能够更容易地研究汇编输出。
另外,忘了说,我在 windows,msys2。不过回答还是有帮助的。
How can I find source code for printf and rand in there?
它们(printf
、rand
、等等....)是您的一部分 C standard library which (on Linux) is outside of the GCC compiler. But crt0 由 GCC 提供(但是,通常不使用调试信息编译)并且在编译 GCC 期间,在构建树中生成了一些 C 文件。
(在 Windows,大多数 C 标准库都是专有的 - 在 MicroSoft 提供的一些 DLL 中 - 你可能被禁止查看实现或对其进行逆向工程; AFAIK 欧盟法律可能会提到一些与互操作性相关的例外情况,但是你需要咨询律师,我不是律师)
查看 Linux 内核提供的 GNU glibc (or perhaps musl-libc) if you want to study its source code. libc
is generally using system calls (listed in syscalls(2))。
I'd like to step through them in debugger.
在实践中,您将无法轻松做到这一点,因为 libc
是由您的发行版提供的,并且通常 在没有 调试信息的情况下 DWARF格式。
一些 Linux 发行版提供了 libc
的可调试变体,可能作为某些 libc6-dbg
包。
(你的问题缺乏动机,闻起来有些XY problem)
I intend to study and replace them one by one.
这是非常不现实的(特别是在 Windows 上,其 system call 界面没有很好的文档记录)并且可能会花费您很多年(或者可能超过一生)。你有那么多时间吗?
另请阅读 Operating Systems: Three Easy Pieces and look into OsDev wiki。
I'm trying to do so because I'm trying to decrease size of my executable.
错误的方法。调试器需要调试信息(例如在 DWARF 中),这将 增加 可执行文件的大小(但稍后可以 stripped)。顺便说一句,标准 C 函数位于许多进程使用的一些公共共享库(或 Windows 上的 DLL)中。
I'm on windows, msys2.
错误的选择。 Windows 是专有的。 Linux 由 free software 组成(超过 100 亿行源代码,如果你考虑一个典型的 Linux 发行版中的所有有用包),你可以研究其源代码(即使它会花好几辈子)。
当我进入调试程序时,它说找不到 crt/crt_c.c
文件。我下载了 gcc 6.3.0 的源代码,但是 crt_c.c 在哪里?
另外,我如何在其中找到 printf 和 rand 的源代码?我想在调试器中逐步完成它们。
Ide 是代码块,如果这很重要的话。
编辑:我试图这样做是因为我试图减小可执行文件的大小。直接进入freestanding 给我留下了很多缺失的功能,所以我打算一一研究并替换它们。我试图这样做是为了让我的程序更小更快,并且能够更容易地研究汇编输出。
另外,忘了说,我在 windows,msys2。不过回答还是有帮助的。
How can I find source code for printf and rand in there?
它们(printf
、rand
、等等....)是您的一部分 C standard library which (on Linux) is outside of the GCC compiler. But crt0 由 GCC 提供(但是,通常不使用调试信息编译)并且在编译 GCC 期间,在构建树中生成了一些 C 文件。
(在 Windows,大多数 C 标准库都是专有的 - 在 MicroSoft 提供的一些 DLL 中 - 你可能被禁止查看实现或对其进行逆向工程; AFAIK 欧盟法律可能会提到一些与互操作性相关的例外情况,但是你需要咨询律师,我不是律师)
查看 Linux 内核提供的 GNU glibc (or perhaps musl-libc) if you want to study its source code. libc
is generally using system calls (listed in syscalls(2))。
I'd like to step through them in debugger.
在实践中,您将无法轻松做到这一点,因为 libc
是由您的发行版提供的,并且通常 在没有 调试信息的情况下 DWARF格式。
一些 Linux 发行版提供了 libc
的可调试变体,可能作为某些 libc6-dbg
包。
(你的问题缺乏动机,闻起来有些XY problem)
I intend to study and replace them one by one.
这是非常不现实的(特别是在 Windows 上,其 system call 界面没有很好的文档记录)并且可能会花费您很多年(或者可能超过一生)。你有那么多时间吗?
另请阅读 Operating Systems: Three Easy Pieces and look into OsDev wiki。
I'm trying to do so because I'm trying to decrease size of my executable.
错误的方法。调试器需要调试信息(例如在 DWARF 中),这将 增加 可执行文件的大小(但稍后可以 stripped)。顺便说一句,标准 C 函数位于许多进程使用的一些公共共享库(或 Windows 上的 DLL)中。
I'm on windows, msys2.
错误的选择。 Windows 是专有的。 Linux 由 free software 组成(超过 100 亿行源代码,如果你考虑一个典型的 Linux 发行版中的所有有用包),你可以研究其源代码(即使它会花好几辈子)。