0

Eclipse を使用して redhat で g++ 64 ビットでコンパイルします。

コンパイル エラー: ../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.cpp 


C_SRCS += \
../client_rsa.c 

OBJS += \
./CRI.o 


C_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 ' '

オブジェクト.mk

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

USER_OBJS :=

LIBS := -lBB_IO_lib.0.1 -lskd3_clnt_30134500 -lcryptopp

ソース.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 \
4

1 に答える 1

4

静的にコンパイルすると、アセンブラ命令は、コードの局所性に関する特定の事柄を想定します。たとえば、ジャンプは、ジャンプ/呼び出し命令の 4GB 以内です。(64b x86 を想定)。共有ライブラリは 4GB よりも離れた場所にロードされる可能性があるため、ジャンプ/呼び出しが収まりません。

-fPIC (位置に依存しないコード) でコンパイルすると、コンパイラはコードとローカル データ参照が位置に依存しないことを保証し、それ自体の外部での呼び出し/ジャンプが最悪の場合/最大のアドレッシング モードで発生するように調整します (例: フル 64b)。 .

このエラーが発生した場合、静的ライブラリは共有ライブラリにジャンプできません。上記のショートカットが使用されています。唯一の解決策は、-fPIC を指定して再コンパイルすることです。(技術的には、32 ビット ジャンプは 5 バイトしかないかもしれませんが、9 バイト [1 オペコード + addr の 8] が必要です。したがって、アセンブラーの巧妙さがこれを回避することはできません。短い手のジャンプを提供するために)。

現在、パフォーマンスが重要でない限り、共有されているかどうかに関係なく、ほとんどすべてを -fPIC でコンパイルできます/コンパイルする必要があります。

于 2013-06-24T22:01:49.543 に答える