Boost:无法在x86上建立共享库

时间:2020-01-30 19:47:13

标签: boost dll x86 shared-libraries static-libraries

在为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命令中,但是出现了相同的错误。任何见识将不胜感激。谢谢!

1 个答案:

答案 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的专家,则需要使用源代码或不使用此静态库。