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

博客讲述了在服务器上编译linux-x86-64版本库时出现错误,在自己电脑测试却可编译的问题。经排查,很可能是ld版本不对,确定pc上ld版本为2.26,服务器上为2.24。还提及了有root权限和无root权限的解决方向及源码下载地址。
问题

今天使用的一个库更新了,升级新的版本之后,在服务器上编译linux-x86-64版本的时候会出现错误:
/usr/bin/ld: libsdk.a(Imagexxx.cpp.o): unrecognized relocation (0x2a) in section .text
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

随后在自己的电脑测试了一下,结果可以编译。

结合在stack overflow上看到的相关信息:
https://stackoverflow.com/questions/46058050/unable-to-compile-unrecognized-relocation

很可能是ld版本不对

确定了版本信息:
pc上ld版本:
GNU ld(GNU Binutils for Ubuntu) 2.26
服务器上ld版本:
GNU ld(GNU Binutils for Ubuntu) 2.24

解决

有root权限

$ sudo apt-get update
$ sudo apt-get install binutils-2.26

export PATH="/usr/lib/binutils-2.26/bin:$PATH"

没有root权限
下载源码:
https://ftp.gnu.org/gnu/binutils/

tar -zxvf binutils-2.26.tar.gz
cd binutils-2.26
./configure --prefix=/home/xxx/binutils
make
make install
export PATH="/home/xxx/binutils/bin:$PATH"
### 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 ``` --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值