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

问题描述 投票:0回答:1

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

boost dll x86 shared-libraries static-libraries
1个回答
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的专家,则需要使用源代码或不使用此静态库。

© www.soinside.com 2019 - 2024. All rights reserved.