gdb,如何进入c运行时? crt_c.c在哪里?

时间:2017-09-14 09:16:15

标签: gcc gdb runtime msys2

当我进入调试程序时,它说它无法找到crt/crt_c.c文件。我下载了gcc 6.3.0的源代码,但那里的crt_c.c在哪里?

另外如何在那里找到printf和rand的源代码?我想在调试器中逐步完成它们。

Ide是代码块,如果这很重要的话。

编辑:我正在尝试这样做,因为我正在尝试减少可执行文件的大小。直接进入独立式会让我失去很多功能,所以我打算一个接一个地学习和替换它们。我正在尝试这样做,使我的程序更小更快,并且能够更容易地研究装配输出。

另外,忘了提一下,我在windows上,msys2。但答案仍然有用。

1 个答案:

答案 0 :(得分:0)

  

如何在那里找到printf和rand的源代码?

他们(printfrand等......)是C standard library的一部分,GCC(在Linux上) 的{{3>} 3}}编译器。但crt0由GCC提供(但是,通常不会使用调试信息进行编译),并且在编译GCC期间会在构建树中生成一些C文件。

(在Windows上,大多数C标准库都是专有的 - 在MicroSoft提供的一些DLL中 - 你可能被禁止查看实现或对其进行反向工程; AFAIK欧盟法律可能会提到一些例外与互操作性有关但是你需要咨询律师而我不是律师。

如果你想研究它的源代码,请查看GNU glibc(或者musl-libc)。 libc通常使用Linux内核提供的系统调用(在syscalls(2)中列出)。

  

我想在调试器中逐步完成它们。

在实践中,您将无法轻松地执行此操作,因为libc由您的发行版提供,并且通常已编译为而没有 DWARF格式的调试信息

某些Linux发行版提供libc的可调试变体,可能是某些libc6-dbg包。

(你的问题缺乏动力,闻起来像XY problem}

  

我打算一个接一个地研究和替换它们。

这是非常不现实的(特别是在Windows上,其system call界面没有很好地记录)并且可能需要很多年(或者可能超过一生)。你有那么多时间吗?

另请阅读Operating Systems: Three Easy Pieces并查看OsDev wiki。

  

我正在尝试这样做,因为我正在尝试减少可执行文件的大小。

错误的做法。调试器需要调试信息(例如在DWARF中),它将增加可执行文件的大小(但以后可能是strip ped)。 BTW标准C函数位于许多进程使用的一些常见共享库(或Windows上的DLL)中。

  

我在Windows上,msys2。

糟糕的选择。 Windows是专有的。 Linux由free software构成(超过十亿行源代码,如果你考虑一个典型的Linux发行版中的所有有用的包),你可以学习它的源代码(即使它需要几个生命周期)。 p>