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

时间:2016-01-14 12:51:11

标签: c gdb

在深入探讨我的问题之前,我需要承认我对这个问题仍然缺乏经验,并且对很多概念感到困惑,所以如果我提出这些问题的方式似乎没有组织,请耐心等待。

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

与我上面讨论的内容无关的另一个问题是,系统(),execve()等许多函数是否特定于Linux操作系统,或者它们是否也用于Windows操作系统?的 [问题3]

希望你们能帮助我。提前谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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