在为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,并且仅针对共享库。我也将-fPIC标志添加到b2命令中,但是出现了相同的错误。任何见识将不胜感激。谢谢!
答案 0 :(得分:1)
libTestChecker.a
不是以PIC兼容的方式构建的;您无法将其链接到共享库中。 您需要使用-fPIC
从源代码重建 it 。
没有其他可行的方法可以解决此问题;对于某些符号地址(R_X86_64_32
),它使用32位绝对重定位,而GNU / Linux x86-64动态链接器中根本不支持它。
没有源代码,您的选择包括疯狂的事情,例如拆卸库,手动修改asm以使用7字节的lea rdi, [RIP + symbol]
而不是5字节的mov edi, OFFSET symbol
(GAS Intel语法),然后重新组装
或者为索引静态数组,您可能需要查找LEA的备用寄存器以替换诸如mov eax, [array + rdx*4]
之类的指令。
TL:D:R:如果您不是x86-64 asm的专家,则需要使用源代码或不使用此静态库。