You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 9 Stream编译OceanBase遇R_X86_64_32重定位错误求助

解决OceanBase替换libapr 0.7.0后编译出现的R_X86_64_32链接错误

问题根源

报错核心是libapr-1.a静态库中的目标文件未以位置无关代码(PIC)编译,在x86_64架构下动态链接时,非PIC的静态库会触发R_X86_64_32重定位错误。手动修改Makefile添加-fPIC可能被configure生成的配置覆盖,需从apr编译源头解决。


方案一:重新编译带PIC参数的libapr 0.7.0

  1. 清理apr源码编译残留,重新配置编译参数:
# 进入apr-0.7.0源码目录
cd apr-0.7.0
# 彻底清理之前的编译痕迹
make clean && make distclean
# 配置时直接指定CFLAGS/CXXFLAGS包含-fPIC,同时指定安装路径
./configure --prefix=/usr/local/apr CFLAGS="-fPIC" CXXFLAGS="-fPIC"
# 编译并安装
make && make install
  1. 替换OceanBase依赖目录中的libapr文件,修正pkgconfig路径:
# 进入OceanBase的依赖库目录
cd /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib
# 删除旧的libapr文件
rm -rf libapr-1.*
# 复制新编译的libapr文件
cp /usr/local/apr/lib/libapr-1.* .

# 替换并修正pkgconfig配置
cd ../pkgconfig
rm -f apr-1.pc
cp /usr/local/apr/lib/pkgconfig/apr-1.pc .
# 将pc文件中的prefix路径替换为OceanBase依赖的本地路径
sed -i 's/prefix=\/usr\/local\/apr/prefix=\/home\/meyok\/Project\/oceanbase\/deps\/3rd\/usr\/local\/oceanbase\/deps\/devel/' apr-1.pc
  1. 重新编译OceanBase:
cd /home/meyok/Project/oceanbase
bash build.sh debug --init --make

方案二:给OceanBase编译添加链接器参数

若重新编译apr仍无法解决,可直接在OceanBase编译时添加链接器参数,允许文本重定位:

  • 临时通过build.sh传递参数:
bash build.sh debug --init --make \
  CMAKE_EXE_LINKER_FLAGS="-Wl,-z,notext" \
  CMAKE_SHARED_LINKER_FLAGS="-Wl,-z,notext"
  • 或修改根目录CMakeLists.txt(需后续编译前清理缓存):
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,notext")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,notext")

方案三:强制apr生成纯静态PIC库

若OceanBase采用强制静态链接,需确保apr生成的静态库是纯PIC格式:

cd apr-0.7.0
make clean && make distclean
# 配置时禁用动态库,仅生成静态库并指定PIC
./configure --prefix=/usr/local/apr CFLAGS="-fPIC" CXXFLAGS="-fPIC" --enable-static --disable-shared
make && make install

后续重复方案一中的替换和编译步骤即可。

内容的提问来源于stack exchange,提问作者MeYokYang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:45:17