2011-08-06 12 views
4
链接库

我的代码是在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. 这三个库全都是动态默认由gcc链接?
  5. 我怎样才能找到静态默认情况下gcc链接到的库?

谢谢!

回答

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

谢谢!这三个库是否都默认由gcc链接? – Tim

+0

@Tim:将其添加到答案中。 –

+0

(1)这三个库都是由gcc默认动态链接的吗? (2)如何找到gcc默认链接的静态库? – Tim

1

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

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

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

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

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

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

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

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

+0

谢谢!这三个库是否都默认由gcc链接? – Tim

+0

crt1.o是一个库吗?如果是,动态共享库或静态库? – Tim

+0

在C模式下,这些是动态链接的库。其他语言可以添加其他库(例如'libstdC++')。 –

1

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

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