Object 都是;。o";档案;“可加载”吗;?

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满足哪些属性?我相信它是可链接的,不可执行的。我相信它

我一直在阅读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
    满足哪些属性?我相信它是可链接的,不可执行的。我相信它是不可加载的(除非您从.o文件创建一个.so文件);然而类型
    REL
    意味着它应该被重新定位,并且重新定位只会在加载的上下文中发生,所以我在这里有一个混淆。 我的疑问总结如下:-

  • “.o”文件可加载吗
  • 阅读有关“.o”、“.so”文件中各节的参考资料-差异等
  • 只需将上下文状态设置为类似(仅强调可读性)

    文件可以是可链接的,用作链接编辑器的输入或链接 加载器。它应该是可执行的,能够加载到 内存并作为程序运行,可加载,可加载 作为一个库和一个程序或其任何组合进入内存 三个

    o文件是链接器对象文件,根据此定义,不可执行绝对可链接。Loadable是一个更难的定义,但是由于.o文件如果没有一些绝对不跨平台的技巧是不可加载的,所以我要说它的精神在于它是不可加载的

    对象文件(即扩展名为.o的文件)是不可加载的。这是因为它缺少有关如何解析其中所有符号的关键信息:在这种情况下,
    println
    符号尤其需要额外的信息。(C编译器不会将库标识绑定到它们创建的对象文件中,这有时甚至很有用。)

    将对象文件链接到共享库(.so)时,您正在添加该绑定。通常,您还将一些对象文件分组在一起,并解析它们之间的引用(加上一些更为深奥的东西)。这样就可以加载结果,因为加载程序可以解析引用并加载它还不知道的依赖项


    从那里转到可执行文件通常只是在OS定义的程序引导上添加一个问题。这是一小段代码,操作系统将通过调用来启动运行的程序,它通常通过加载程序的其余部分和依赖项,然后调用
    main()
    ,并提供有关参数的信息来工作。(如果main返回,它还负责干净地退出。)

    通过程序引导,您指的是libc_start_main吗?@eQuiNoX_uuuu?我指的是通常位于(链接之前)称为
    crt0.o的文件中的代码,尽管现代链接器实际上可能在内部保存代码。