Boost: невозможно построить общую библиотеку на x86 - PullRequest
0 голосов
/ 30 января 2020

У меня проблема со сборкой моей общей библиотеки для 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
    ;

Когда я собираю вышеупомянутую библиотеку (JniApp) для pp c, тогда все в порядке. Однако, когда я пытаюсь собрать для x86, сохранение общей библиотеки не работает. Я должен добавить stati c, и все будет хорошо, будет создана библиотека stati c. Однако мне нужна общая библиотека. Ошибка, которая отображается при сборке 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 и только для общей библиотеки. Я также добавил флаг -fPI C в команду b2, но появляется та же ошибка. Любое понимание будет оценено. Спасибо!

1 Ответ

1 голос
/ 31 января 2020

libTestChecker.a не построен в режиме, совместимом с PI C; Вы не можете связать его в общей библиотеке. Вам нужно перестроить it из источника с -fPIC.

Нет другого практического способа исправить это; он использует 32-разрядные абсолютные перемещения для некоторых символьных адресов (R_X86_64_32), и его просто нет в компоновщике динамического c GNU / Linux x86-64.


Без исходного кода ваши варианты включают в себя такие сумасшедшие вещи, как дизассемблирование библиотеки, изменение вручную asm для использования 7-байтового lea rdi, [RIP + symbol] вместо 5-байтового mov edi, OFFSET symbol (синтаксис GAS Intel), а затем повторная сборка.

или для индексируя stati c массивов, вам может понадобиться найти запасной регистр для LEA, чтобы заменить такие инструкции, как mov eax, [array + rdx*4].

TL: D: R: если вы не являетесь экспертом в x86-64 asm , вам нужен источник или чтобы не использовать эту библиотеку stati c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...