(旧事重提) gcc的那些事

旧事

gcc 编译 汇编 链接 => https://www.cnblogs.com/develon/p/9690641.html

32位与64位应用程序

要为不同平台交叉编译, 安装gcc-multilib即可.

apt install -y gcc-multilib

接下来, 通过-m32-m64选项即可控制gcc生成对应平台构件.

汇编中的可重定位代码位置无关代码(PIC)

我们知道应用程序的产生经过以下阶段:

cpp预处理(产物:处理过头文件和宏定义的.i源码) => gcc -S编译(产物:.s汇编代码) => as汇编(产物:obj文件) => ld链接(产物:二进制应用程序)

在编译的这个过程中, 可以生成可重定位代码、位置无关代码两种选择, 分别用于动态和静态链接应用程序.
要生成共享库, 必须使用位置无关代码, 可以这么理解:

位置无关代码采用PLT技术, 将依赖的外部符号地址申请保存在一个全局对象偏移表中(GOT), 由动态链接器在加载动态库时填充该表, 实现动态加载符号.

可重定位代码将依赖的外部符号地址留白, 由链接时直接定位.

gcc -S命令默认生成可重定位代码, 可以使用-fPIE-fPIC指定生成位置无关代码.

下面是一份两者的汇编代码差异比较:

如果要制作共享库(-shared), 则必须使用PLT技术.

END

原文地址:https://www.cnblogs.com/develon/p/13586842.html