默认链接的库

时间:2011-08-06 22:03:33

标签: c linux gcc

我的代码在test.c中:

int main(){
return 0;
}

从它编译的可执行文件所依赖的动态共享库是:

$ 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. 我想知道这三个图书馆正扮演什么角色?
  2. 函数main属于哪个库? /lib/libc.so.6?
  3. return属于哪个库? /lib/libc.so.6?
  4. 默认情况下,这三个库是否都是动态链接的?
  5. 如何找到默认情况下gcc链接到的静态库?
  6. 谢谢!

5 个答案:

答案 0 :(得分:2)

  1. linux-gate是一个虚拟共享对象,充当内核中系统调用的连接。 libc是glibc,它提供printf()等功能。 ld-linux是glibc加载器,它允许加载其他共享对象。

  2. main()属于您的代码。它由crt1.o调用,它通过gcc链接到可执行文件中(具体而言,ld)。

  3. return不是函数,而是语言构造,因此gcc将其直接转换为对象(最终可执行文件)中包含的代码。另外,main()返回的值由crt1.o捕获并转换为程序结果代码。

答案 1 :(得分:2)

  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标准库的数学部分)。

答案 2 :(得分:2)

关于how does linux execute my main()?的实用说明在那里你会找到答案,可能还有更多!

答案 3 :(得分:1)

linux-gate是一个虚拟库,提供对系统功能的访问。它的全名是Linux Virtual Dynamic Shared Object。它由libc使用。

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

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

main生活在test.o中,而不是在库中。

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

答案 4 :(得分:1)

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

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