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
- 清理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
- 替换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
- 重新编译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
相关产品推荐
相关产品推荐

