Boost:无法在 x86 上构建共享库
Boost: Unable to build a shared library on x86
我在为 x86 构建共享库时遇到问题。
我的 Jamfile 看起来像这样 - 名称已更改:
import os ;
args = [ modules.peek : ARGV ] ;
local JAVA_HOME = [ os.environ JAVA_HOME ] ;
type = test1 ;
lib $(type)prog
: :
<name>TestChecker
<search> /path/to/lib/x86/lib
<search> /path/to/lib/ppc/lib
: :
<include> /path/to/inc/
;
lib JniApp
: # sources
JniApp.cpp
$(type)prog
: # requirements
<define>JNI
<include>.
<include>/${JAVA_HOME}/include
<include>/${JAVA_HOME}/include/linux
<library>/test.app//app_lib/<link>static
<library>/test.app//app2_lib/<link>static
: # default-build
: # usage-requirements
;
当我为 ppc 构建上述库 (JniApp) 时,一切都很好。但是,当我尝试为 x86 构建时,将其保留为共享库不起作用。我必须添加静态,一切都会好起来的,一个静态库将被创建。但是,我需要一个共享库。我构建 x86 时显示的错误如下:
/path/to/lib/x86/lib/libTestChecker.a(Exceptions.cpp.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/path/to/lib/x86/lib/libTestChecker.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
"TestChecker.a" 库是预先存在的,不是我创建的。我只是用它来创建我的 JniApp 库。我不确定为什么会发生此错误,但仅适用于 x86,并且仅适用于共享库。我还在 b2 命令中添加了 -fPIC 标志,但出现了同样的错误。任何见解将不胜感激。谢谢!
libTestChecker.a
不是以 PIC 兼容的方式构建的;你不能 link 它进入共享库。 您需要使用 -fPIC
.
从源代码重建 它
没有其他实用的方法可以解决这个问题;它对某些符号地址 (R_X86_64_32
) 使用 32 位绝对重定位,并且在 GNU/Linux x86-64 动态 linker.
中根本不支持它
没有源代码,你的选择包括疯狂的东西,比如反汇编库,手动修改 asm 以使用 7 字节 lea rdi, [RIP + symbol]
而不是 5 字节 mov edi, OFFSET symbol
(GAS Intel 语法),然后重新-assemble.
或者为了索引静态数组,您可能需要为 LEA 找到一个备用寄存器来替换像 mov eax, [array + rdx*4]
.
这样的指令
TL:D:R:如果您不是 x86-64 asm 专家,您需要源代码,否则不要使用此静态库。
我在为 x86 构建共享库时遇到问题。
我的 Jamfile 看起来像这样 - 名称已更改:
import os ;
args = [ modules.peek : ARGV ] ;
local JAVA_HOME = [ os.environ JAVA_HOME ] ;
type = test1 ;
lib $(type)prog
: :
<name>TestChecker
<search> /path/to/lib/x86/lib
<search> /path/to/lib/ppc/lib
: :
<include> /path/to/inc/
;
lib JniApp
: # sources
JniApp.cpp
$(type)prog
: # requirements
<define>JNI
<include>.
<include>/${JAVA_HOME}/include
<include>/${JAVA_HOME}/include/linux
<library>/test.app//app_lib/<link>static
<library>/test.app//app2_lib/<link>static
: # default-build
: # usage-requirements
;
当我为 ppc 构建上述库 (JniApp) 时,一切都很好。但是,当我尝试为 x86 构建时,将其保留为共享库不起作用。我必须添加静态,一切都会好起来的,一个静态库将被创建。但是,我需要一个共享库。我构建 x86 时显示的错误如下:
/path/to/lib/x86/lib/libTestChecker.a(Exceptions.cpp.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/path/to/lib/x86/lib/libTestChecker.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
"TestChecker.a" 库是预先存在的,不是我创建的。我只是用它来创建我的 JniApp 库。我不确定为什么会发生此错误,但仅适用于 x86,并且仅适用于共享库。我还在 b2 命令中添加了 -fPIC 标志,但出现了同样的错误。任何见解将不胜感激。谢谢!
libTestChecker.a
不是以 PIC 兼容的方式构建的;你不能 link 它进入共享库。 您需要使用 -fPIC
.
没有其他实用的方法可以解决这个问题;它对某些符号地址 (R_X86_64_32
) 使用 32 位绝对重定位,并且在 GNU/Linux x86-64 动态 linker.
没有源代码,你的选择包括疯狂的东西,比如反汇编库,手动修改 asm 以使用 7 字节 lea rdi, [RIP + symbol]
而不是 5 字节 mov edi, OFFSET symbol
(GAS Intel 语法),然后重新-assemble.
或者为了索引静态数组,您可能需要为 LEA 找到一个备用寄存器来替换像 mov eax, [array + rdx*4]
.
TL:D:R:如果您不是 x86-64 asm 专家,您需要源代码,否则不要使用此静态库。