Object 都是;。o";档案;“可加载”吗;?
我一直在阅读John R.Levine的链接器和加载程序,我读到一个对象文件的属性将包括以下一个或多个Object 都是;。o";档案;“可加载”吗;?,object,linker,loader,elf,Object,Linker,Loader,Elf,我一直在阅读John R.Levine的链接器和加载程序,我读到一个对象文件的属性将包括以下一个或多个 文件应该是可链接的 文件应该是可加载的 文件应该是可执行的 现在,考虑这个例子: #包括 int main(){ printf(“测试”); 返回0; } 我将编译并与之链接: $ gcc -c t.c $ gcc -o t t.o $gcc-c t.c $gcc-o t.o 我尝试使用objdump检查t.o,其类型显示为REL。t.o满足哪些属性?我相信它是可链接的,不可执行的。我相信它
#包括
int main(){
printf(“测试”);
返回0;
}
我将编译并与之链接:
$ gcc -c t.c
$ gcc -o t t.o
$gcc-c t.c
$gcc-o t.o
我尝试使用objdump
检查t.o
,其类型显示为REL
。t.o
满足哪些属性?我相信它是可链接的,不可执行的。我相信它是不可加载的(除非您从.o文件创建一个.so文件);然而类型REL
意味着它应该被重新定位,并且重新定位只会在加载的上下文中发生,所以我在这里有一个混淆。
我的疑问总结如下:-
println
符号尤其需要额外的信息。(C编译器不会将库标识绑定到它们创建的对象文件中,这有时甚至很有用。)
将对象文件链接到共享库(.so)时,您正在添加该绑定。通常,您还将一些对象文件分组在一起,并解析它们之间的引用(加上一些更为深奥的东西)。这样就可以加载结果,因为加载程序可以解析引用并加载它还不知道的依赖项
从那里转到可执行文件通常只是在OS定义的程序引导上添加一个问题。这是一小段代码,操作系统将通过调用来启动运行的程序,它通常通过加载程序的其余部分和依赖项,然后调用
main()
,并提供有关参数的信息来工作。(如果main返回,它还负责干净地退出。)通过程序引导,您指的是libc_start_main吗?@eQuiNoX_uuuu?我指的是通常位于(链接之前)称为crt0.o的文件中的代码,尽管现代链接器实际上可能在内部保存代码。