связывание статической (.a) библиотеки с общей (.so) библиотекой, получение ошибки «перемещение R_X86_64_32S к локальному символу; перекомпилировать с -fPIC & quot;

Компиляция с g ++ 64 bit в redhat с использованием eclipse.

Ошибка компиляции:
../lib-EL5-64bit/libskd3_clnt_30134500.a(skd_clnt.o): перемещение R_X86_64_32S к `локальному символу ‘нельзя использовать при создании общего объекта; перекомпилировать с -fPIC

Вещи, которые я пробовал
Я добавил -fPIC как к флагам компилятора c ++, так и к флагам компоновщика. Он уже существовал в флагах компилятора, я просто переместил его сразу после g ++ и в конце списка.

Я попросил создателя библиотеки .a перекомпилировать с -fPIC, и она по-прежнему выдает ту же ошибку

Есть ли способ убедиться, что их библиотека была скомпилирована с -fPIC?
В сообщении об ошибке указано, что мне нужно скомпилировать .so с помощью -fPIC или файл .a должен быть скомпилирован с помощью -fPIC?
Что еще я могу проверить?

Вот файл make (автоматически сгенерированный eclipse)

Сделать файл:

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include generic_d2s/subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C++_DEPS)),)
-include $(C++_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(CC_DEPS)),)
-include $(CC_DEPS)
endif
ifneq ($(strip $(CPP_DEPS)),)
-include $(CPP_DEPS)
endif
ifneq ($(strip $(CXX_DEPS)),)
-include $(CXX_DEPS)
endif
ifneq ($(strip $(C_UPPER_DEPS)),)
-include $(C_UPPER_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables

# All Target
all: libFUSE.so

# Tool invocations
libFUSE.so: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: GCC C++ Linker'
g++ -fPIC -L../../CRYPTOPP/lib-EL5-64bit -L../lib-EL5-64bit -Wl,-rpath /lib -shared -o"libFUSE.so" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '

# Other Targets
clean:
-$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(LIBRARIES)$(CPP_DEPS)$(CXX_DEPS)$(C_UPPER_DEPS) libFUSE.so
-@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

subdir.mk

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

# Add inputs and outputs from these tool invocations to the build variables
CPP_SRCS += \
../CRI.cppC_SRCS += \
../client_rsa.c

OBJS += \
./CRI.oC_DEPS += \
./client_rsa.d

CPP_DEPS += \
./CRI.d# Each subdirectory must supply rules for building sources it contributes
%.o: ../%.cpp
@echo 'Building file: $<'
@echo 'Invoking: GCC C++ Compiler'
g++ -D_TM_CDIR='"/proj/kronos/test/hho/testprograms/trunk/testmethods/FUSE"' -I../../CRYPTOPP/include/cryptopp -I"/opt/hp93000/soc/pws/lib" -I"/opt/hp93000/soc/com/include" -I/opt/hp93000/soc/prod_com/include -I/opt/hp93000/soc/prod_com/include/MAPI -I/opt/hp93000/soc/testmethod/include -O0 -g3 -Wall -c -fmessage-length=0 -shared -fPIC  -Wreturn-type -Wmissing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label -Wunused-parameter -Wunused-variable -Wunused-value -Wunknown-pragmas -Wsign-compare -Wconversion -fPIC -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"@echo 'Finished building: $<'
@echo ' '

%.o: ../%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -D_TM_CDIR='"/proj/kronos/test/hho/testprograms/trunk/testmethods/FUSE"' -I/opt/hp93000/soc/prod_com/include -I/opt/hp93000/soc/prod_com/include/MAPI -I/opt/hp93000/soc/testmethod/include -I/opt/hp93000/soc/com/include -I/opt/hp93000/soc/pws/lib -O0 -g3 -Wall -c -fmessage-length=0 -fPIC  -Wreturn-type -Wmissing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label -Wunused-parameter -Wunused-variable -Wunused-value -Wunknown-pragmas -Wsign-compare -Wconversion -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"@echo 'Finished building: $<'
@echo ' '

objects.mk

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

USER_OBJS :=

LIBS := -lBB_IO_lib.0.1 -lskd3_clnt_30134500 -lcryptopp

sources.mk

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

O_SRCS :=
CPP_SRCS :=
C_UPPER_SRCS :=
C_SRCS :=
S_UPPER_SRCS :=
OBJ_SRCS :=
ASM_SRCS :=
CXX_SRCS :=
C++_SRCS :=
CC_SRCS :=
OBJS :=
C++_DEPS :=
C_DEPS :=
CC_DEPS :=
LIBRARIES :=
CPP_DEPS :=
CXX_DEPS :=
C_UPPER_DEPS :=

# Every subdirectory with source files must be described here
SUBDIRS := \
. \
generic_d2s \

0

Решение

Когда вы компилируете статически, инструкции ассемблера будут предполагать определенные вещи о локальности кода, например, любой прыжок находится в пределах 4 ГБ от инструкции по прыжкам / вызовам. (Предполагая 64b x86). Общие библиотеки могут быть загружены дальше, чем 4 ГБ, так что переход / вызов не подойдут.

Когда вы компилируете с -fPIC (позиционно-независимый код) — компилятор гарантирует, что код и ссылки на локальные данные не зависят от позиции, и организует, чтобы вызовы / переходы вне себя происходили с наихудшим случаем / режимом максимальной адресации (например, полная 64b) ,

Когда вы получаете эту ошибку, как у вас, статическая библиотека не может перейти к общей библиотеке — ярлыки выше были приняты. Единственное решение — это перекомпиляция с -fPIC. (Технически, 32-битный переход может быть только 5 байтов, но вам нужно 9 байтов [1 код операции + 8 для адреса]), поэтому никакие умения ассемблера не могут обойти это — не без какой-либо другой подлой операции, такой как использование инструкций INT обеспечить короткий прыжок рукой).

В настоящее время большинство всего может / должно быть скомпилировано с -fPIC независимо от общего доступа — если производительность не важна.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]