如何通过链接器处理共享对象(.so)中的函数main()?

sil*_*tor 7 c linker shared-libraries

假设我有

  • source.o没有函数的对象文件()main.

  • libmain.so带有函数的共享对象()main.

当链接器动态链接以创建二进制文件时,链接器如何处理入口点source.bin

R..*_*R.. 8

每当你有一个动态链接程序时,都会涉及几个"入口点".第一个是动态链接器本身的入口点,例如/lib/ld-linux.so.2(在Linux/x86上)或类似的.动态链接器首先运行,将所有符号名称解析为它们的定义(无论定义是在主程序还是库中),然后将执行传递到主程序二进制文件中的第二个入口点.这不是main"C运行时"(因此crt.o和类似的名称)的一部分,它负责一些预处理main(如C++ ctors,设置指向环境变量的指针,以及构造正确的参数main).此代码与(相当于)结束exit(main(argc, argv));,其将使用重定位(通过动态连接器)两者的地址exitmain.