我的代码在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)
main
属于哪个库? /lib/libc.so.6?return
属于哪个库? /lib/libc.so.6?谢谢!
答案 0 :(得分:2)
linux-gate
是一个虚拟共享对象,充当内核中系统调用的连接。 libc
是glibc,它提供printf()
等功能。 ld-linux
是glibc加载器,它允许加载其他共享对象。
main()
属于您的代码。它由crt1.o
调用,它通过gcc链接到可执行文件中(具体而言,ld)。
return
不是函数,而是语言构造,因此gcc将其直接转换为对象(最终可执行文件)中包含的代码。另外,main()
返回的值由crt1.o
捕获并转换为程序结果代码。
答案 1 :(得分:2)
linux-gate.so
实际上并不是一个共享库,而是内核的一部分,它可以像一个一样运行,并使快速系统调用成为可能。 ld-linux.so
是一段代码,可以加载其他共享库。 libc.so
是C库,包含printf
和strcpy
等标准函数。main
不属于任何图书馆。它属于您的程序,因为它的汇编版本完全存储在test
二进制文件中。return
不是函数,而是C语言构造。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语言中的关键字。