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