(旧事重提) 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技术.