c - 当我使用 gdb 调试 C 程序并键入 'p system' 时,我到底得到了什么?

标签 c gdb

在深入探讨我的问题之前,我需要承认我对这个主题还相当缺乏经验,并且对很多概念感到困惑,所以如果我提出这些问题的方式看起来杂乱无章,请耐心等待。

我最近了解到,由于标准 C 库将加载到我们编译的每个 C 程序中(这是因为我们在源文件的开头有 #include 吗?[quesiton1]),我们会将其函数加载到内存中。所以,我知道 system() 函数已经被加载并存储在内存中的某个位置,然后我知道我可以通过调试随机 C 程序找到 system() 函数存储位置的确切地址使用 gdb,并发出命令“p system”,该命令将打印出函数的地址。我知道'p'用于在gdb中打印变量,而'system'在这种情况下可能表示system()函数的地址,所以这样做似乎是有意义的,但后来我想,等等其次,我似乎没有在代码中的任何地方使用 system() 函数,为什么 gdb 的发明者会包含这样一个变量让我打印出一些我什至不使用的函数的地址?这是否意味着标准 C 库中每个函数的地址都可以以相同的方式找到?它们在 gdb 中都有相应的变量名吗? [问题2]

还有一个与我上面谈到的内容无关的问题是,诸如 system()、execve() 等函数是否特定于 Linux 操作系统,或者它们也用于 Windows 操作系统? [问题3]

希望大家能帮帮我。提前致谢!

最佳答案

标准 C 库与每个程序都链接,因为它必须存在才能运行您的程序。在调用 main 函数之前以及返回之后,程序中会发生很多事情,标准库会处理这些事情。它还为您提供了大部分可以调用的标准函数。您可以在没有标准库的情况下编译东西,但这是一个高级主题。这与#include 几乎无关。

Gdb 可以使用 p 查看system,因为它打印的不仅仅是变量。它打印范围内的任何内容。 system 恰好是您在该范围内可见的符号。您可以打印您可见的任何符号,包括 libc 和您的程序中的所有全局可见变量和函数。在这种情况下,符号意味着“程序和其他库需要找到的各种事物的名称”,这包括所有函数、变量、节边界以及编译器/链接器/运行时/调试器需要找到的许多其他事物。工作。

通常标准库是动态链接的,这意味着每个程序都有完全相同的库副本。在这种情况下,其中的所有符号将对您的程序可见,因为没有理由排除它们。如果静态链接程序,则仅包含 libc 的必要部分,并且除非实际使用该函数,否则您可能看不到 system 符号。

关于c - 当我使用 gdb 调试 C 程序并键入 'p system' 时,我到底得到了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34790103/

相关文章:

gdb - 在 GDB 中,如何从用户定义的命令运行内置命令

c - 堆栈溢出 : Have no idea what modify the last one byte of the overwritten return address

memory - 这是内存地址吗?

C OpenMP 并行 for 循环使其比单线程慢得多

c++ - 是否有任何工具可以显示函数内的数据依赖性

c++ - 在 Mac OSX 和 Linux 下使用 printf 语句进行类型转换

c++ - Bison malloc 内存损坏

c - "Throw NULL"C 中的语句

c++ - 非 native 类型上具有多个条件的 GDB 断点

linux - 使用 gdb 调试使用 startx 启动的应用程序