【问题标题】:gdb, how to step into c runtime? Where is crt_c.c?gdb,如何进入 c 运行时? crt_c.c 在哪里?
【发布时间】:2017-09-14 09:16:15
【问题描述】:

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

另外,我如何在其中找到 printf 和 rand 的源代码?我想在调试器中单步调试它们。

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

编辑:我正在尝试这样做,因为我正在尝试减小可执行文件的大小。直接进入独立式让我缺少很多功能,所以我打算一一研究并替换它们。我正在尝试这样做以使我的程序更小更快,并且能够更轻松地研究汇编输出。

另外,忘了提,我在 windows 上,msys2。但回答还是有帮助的。

【问题讨论】:

  • 为什么要进入crt0?请编辑您的问题以激发它
  • 改进你的问题来激发它。否则,它可能会因为过于宽泛或不清楚而被关闭。
  • gdb 和缩小可执行文件大小有什么关系?
  • @BasileStarynkevitch 好吧,我需要先了解代码的作用,然后再将其丢弃。在调试器中运行代码是理解它的最简单方法。
  • 你能负担得起花费一生的时间来回答你的问题吗?

标签: gcc gdb runtime msys2


【解决方案1】:

如何在其中找到 printf 和 rand 的源代码?

它们(printfrand 等....)是 C standard library 的一部分,它(在 Linux 上)在 GCC 编译器的外部。但是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 中),这将增加可执行文件的大小(但以后可能是stripped)。顺便说一句,标准 C 函数位于许多进程使用的一些公共共享库(或 Windows 上的 DLL)中。

我在 Windows 上,msys2。

错误的选择。 Windows 是专有的。 Linux 由 free software(超过 100 亿行的源代码,如果您考虑典型 Linux 发行版中所有有用的软件包)组成,您可以研究其源代码(即使需要好几个生命周期)。

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多