unrecognized relocation (0x2a) in section `.text`

当使用gcc-6.1.0时,如果ld版本低于2.7,可能会遇到unrecognizedrelocation错误。升级ld到2.7或更高版本可以解决问题。这需要下载binutils,配置路径并进行编译安装,最后更新环境变量PATH。完成这些步骤后,重新编译即可消除错误。

出现这个问题最有可能的原因为gcc版本与系统的ld版本不搭引起的。

ld的版本可以通过ld -v查看,像我使用gcc-6.1.0ld版本为2.5 的时候就会报错,升至2.7该错误就会消失。

解决方法:

下载新版的binutils,网址为:http://ftp.gnu.org/gnu/binutils/
无需root用户,直接configure配置好路径,然后make && make install即可。最后配置在~/.bashrc利用export PATH指向binutilsbin文件即可。

souce ~/.bashrc或者重启终端之后,待查看 ld -v更新之后,重新编译,即可消除此错误。

unrecognized relocation (0x2a) in section `.text`_Tatannn的博客-优快云博客

### Nginx 编译错误分析与解决方案 在编译 Nginx 时出现 `ld` 链接错误,提示架构不兼容以及重定位类型未识别的问题,通常是因为目标平台的架构与依赖库(如 OpenSSL 的 `libcrypto.a`)不匹配。以下是问题的具体原因及解决方法。 #### 1. 架构不兼容问题 当编译器尝试将 x86-64 架构的静态库链接到 aarch64(ARM 64 位)架构的目标二进制文件时,会出现架构不兼容的错误。这是由于 `libcrypto.a` 是为 x86-64 架构编译的,而当前系统运行的是 aarch64 架构[^1]。 解决方法: - 确保使用的 OpenSSL 库是为 aarch64 架构编译的。可以通过以下命令检查库的架构: ```bash file /path/to/libcrypto.a ``` 如果输出显示为 x86-64,则需要重新编译 OpenSSL 或下载适合 aarch64 架构的预编译版本。 - 编译 OpenSSL 时,指定目标架构为 aarch64: ```bash ./config --prefix=/usr/local/openssl-aarch64 linux-aarch64 make && make install ``` #### 2. 重定位类型未识别问题 错误信息中提到的 `unrecognized relocation type 0x2` 表明链接器无法解析某些重定位类型。这通常是由于 GNU Binutils 版本过旧或不支持目标架构的特性所致[^2]。 解决方法: - 更新 GNU Binutils 到最新版本。例如,使用以下命令安装较新版本的 Binutils: ```bash yum update binutils ``` - 如果无法更新系统自带的 Binutils,可以手动编译并安装最新版本: ```bash wget https://ftp.gnu.org/gnu/binutils/binutils-2.37.tar.gz tar -xvzf binutils-2.37.tar.gz cd binutils-2.37 ./configure --prefix=/usr/local/binutils make && make install export PATH=/usr/local/binutils/bin:$PATH ``` #### 3. 编译 Nginx 时的配置调整 确保在编译 Nginx 时正确指定了 OpenSSL 库路径,并且使用了适合目标架构的工具链。例如: ```bash ./configure --with-openssl=/path/to/openssl-aarch64 --with-cc-opt="-march=armv8-a" --with-ld-opt="-L/usr/local/openssl-aarch64/lib" ``` #### 4. 检查依赖关系 如果仍然遇到依赖问题,可以尝试清理并重新安装所有依赖项。例如: ```bash yum remove openssl-devel zlib-devel pcre-devel yum install openssl-devel zlib-devel pcre-devel ``` #### 示例代码 以下是一个完整的编译流程示例: ```bash # 安装依赖 yum install gcc make autoconf automake libtool perl # 下载并编译 OpenSSL wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz tar -xvzf openssl-1.1.1k.tar.gz cd openssl-1.1.1k ./config --prefix=/usr/local/openssl-aarch64 linux-aarch64 make && make install # 下载并编译 Nginx cd .. wget http://nginx.org/download/nginx-1.20.1.tar.gz tar -xvzf nginx-1.20.1.tar.gz cd nginx-1.20.1 ./configure --with-openssl=/path/to/openssl-1.1.1k --with-cc-opt="-march=armv8-a" --with-ld-opt="-L/usr/local/openssl-aarch64/lib" make && make install ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值