我的代码是在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)
main
属于哪个库? /lib/libc.so.6? return
属于? /lib/libc.so.6? 谢谢!
linux-gate.so
并不是一个真正的共享库,而是内核的一部分,它可以像一个一样运行,并且可以快速进行系统调用。 ld-linux.so
是一段可以加载其他共享库的代码。 libc.so
是C库,包含像printf
和strcpy
这样的标准函数。 main
不属于任何图书馆。 它属于你的程序,因为它的汇编版本完全存储在test
二进制文件中。 return
不是一个函数,而是一个C语言结构。 libgcc
,这显然不是系统上的共享库(或者会显示)和一些启动代码。 g++
还会链接到libstdc++.so
(C ++标准库)和libm.so
(C标准库的数学部分)。 linux-gate
是一个虚拟共享对象,充当内核中系统调用的连接。 libc
是glibc,它提供了printf()
等printf()
。 ld-linux
是glibc加载器,它允许加载其他共享对象。
main()
属于你的代码。 它被crt1.o
调用,通过gcc链接到可执行文件(特别是,ld)。
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语言中的一个关键字。