mar*_*pic 3 linux linker glibc linux-kernel ld
我知道 ELF 可执行文件需要有一个可见的_start子例程来开始执行。然而,据我所知,内核实际上调用了ld-linux.so(或其他一些解释器)并将执行移交给它。所以,我的问题是:
_start入口点?ld-linux.so?有稳定的API吗?_start可以这么说,一个函数?额外问题:粗略地看一下,Glibclibdl和ld-linux.so都是同一个代码库的一部分,并且紧密地缠绕在一起(使用彼此的私有接口)。这是否意味着不可能编写一个自定义libdl的等效库来实现dlopen等?非C系统语言是否不可能生成不依赖libc且仍然可以加载*.so文件的二进制文件?
入口点通常命名为_start,并在链接到可执行文件的 C 运行时汇编例程中定义。这段简短的代码负责设置堆栈,可能调用 C++ 构造函数,最后调用main. 程序从何处开始执行的最终答案是e_entry可执行文件中 ELF 标头中的值。_start该值由链接器设置为指向。
您可以通过使用检查可执行程序来看到这一点readelf -a progfile。
动态链接使事情变得有点复杂,因为动态链接器首先被加载和启动,负责加载和链接程序所需的共享库。动态链接器也在可执行文件中指定(称为“程序解释器”。)
Lwn.net 有一篇关于程序如何运行的优秀文章,由两部分组成(第二部分),如果您确实想了解该主题的详细信息,我建议您阅读该文章。