加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

c – 包含Linux GCC链接器

发布时间:2020-12-13 19:35:50 所属栏目:Linux 来源:网络整理
导读:我不明白GCC在Linux下如何运作.在源文件中,当我执行以下操作时: #include 编译器是否提取适当的二进制代码并将其插入到已编译的可执行文件中,或者编译器是否插入对外部二进制文件的引用(a-la Windows DLL?) 我想这个问题的通用版本是:在* nix下有没有与Wi

我不明白GCC在Linux下如何运作.在源文件中,当我执行以下操作时:

#include 

编译器是否提取适当的二进制代码并将其插入到已编译的可执行文件中,或者编译器是否插入对外部二进制文件的引用(a-la Windows DLL?)

我想这个问题的通用版本是:在* nix下有没有与Windows DLL相同的概念?

最佳答案
好.当您包含math.h时,编译器将读取包含可以使用的函数和宏的声明的文件.如果你调用在该文件(头文件)中声明的函数,那么编译器会在你的目标文件中插入一个调用指令,该指令将从你编译的文件中生成(让我们称之为test.c,并创建目标文件test). O).它还在该对象文件的重定位表中添加了一个条目:

Relocation section '.rel.text' at offset 0x308 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0000001c  00000902 R_386_PC32        00000000   bar

这将是功能栏的重定位条目.将在符号表中创建一个条目,注意该函数尚未定义:

9: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND bar

将test.o对象文件链接到程序时,需要链接到名为libm.so的数学库. so扩展类似于windows的.dll扩展名.这意味着它是一个共享对象文件.链接时,编译器将修复test.o重定位表中出现的所有位置,用bar函数的正确地址替换其条目.根据您使用库的共享版本还是静态版本(当时称为libm.a),编译器将在编译后执行修复,或者在实际启动程序时在运行时执行修复.完成后,它将在该程序所需的共享库表中注入一个条目. (可以用readelf -d ./test显示):

Dynamic section at offset 0x498 contains 22 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 ... ... ...

现在,如果启动程序,动态链接器将查找该库,并将该库链接到可执行映像.在Linux中,执行此操作的程序称为ld.so.静态库在动态部分中没有位置,因为它们只是链接到其他目标文件,然后被遗忘;从那时起它们就是可执行文件的一部分.

实际上它实际上要复杂得多,而且我也不太明白这一点.不过,这是一个粗略的计划.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读