默认情况下链接的库

我的代码是在test.c中:

int main(){ return 0; } 

从它编译的可执行文件的dynamic共享库依赖于:

 $ gcc -o test test.c $ ldd test linux-gate.so.1 => (0x00783000) libc.so.6 => /lib/libc.so.6 (0x00935000) /lib/ld-linux.so.2 (0x00ea5000) 
  1. 我想知道三个图书馆正在扮演什么angular色?
  2. 函数main属于哪个库? /lib/libc.so.6?
  3. 哪个库return属于? /lib/libc.so.6?
  4. 这三个库都是默认由gcc dynamic链接的吗?
  5. 如何find默认的gcc链接的静态库?

谢谢!

  1. linux-gate.so并不是一个真正的共享库,而是内核的一部分,它可以像一个一样运行,并且可以快速进行系统调用。 ld-linux.so是一段可以加载其他共享库的代码。 libc.so是C库,包含像printfstrcpy这样的标准函数。
  2. main不属于任何图书馆。 它属于你的程序,因为它的汇编版本完全存储在test二进制文件中。
  3. return不是一个函数,而是一个C语言结构。
  4. 不,它也链接到libgcc ,这显然不是系统上的共享库(或者会显示)和一些启动代码。 g++还会链接到libstdc++.so (C ++标准库)和libm.so (C标准库的数学部分)。
  1. linux-gate是一个虚拟共享对象,充当内核中系统调用的连接。 libc是glibc,它提供了printf()printf()ld-linux是glibc加载器,它允许加载其他共享对象。

  2. main()属于你的代码。 它被crt1.o调用,通过gcc链接到可执行文件(特别是,ld)。

  3. return不是一个函数,而是一个语言结构,所以gcc直接把它转换成包含在对象(最终可执行)文件中的代码。 crt1.o ,从main()返回的值被crt1.o捕获并转换成程序结果代码。

关于如何执行我的main()的执行描述? 在那里你会找到答案,可能还有更多!

linux-gate是一个虚拟库,提供对系统功能的访问。 它的全名是Linux虚拟动态共享对象。 它由libc

libc是C运行时间。 这实际上是为你调用main()。 (如果不使用任何C函数,可以绕过这个)

ld-linux是动态链接器,它实际上知道如何为你加载和调用C运行时。

main生活在test.o,而不是在图书馆。

return是一个关键字,而不是一个函数。 它指示编译器发出代码以使该函数将控制权返回给调用者。

ld-linux.so提供了帮助ldd工作的魔力。 libc.so是C运行时库的一部分。 除此之外,运行时库包含调用main的实际入口点。

main由您的代码提供。 return不是函数,它是C语言中的一个关键字。