我正在尝试构建包含一些汇编函数调用其他函数的共享库。当我使用以下代码构建liba.so
时:
void aFunc1()
{
}
asm(
".globl aFunc2\n\t"
".type aFunc2, @function\n\t"
"aFunc2:\n\t"
".cfi_startproc\n\t"
"call aFunc1\n\t" /* note here*/
"ret\n\t"
".cfi_endproc\n\t"
);
命令行操作
gcc -o liba.so a.c -shared -fPIC
我遇到了一个错误。
/usr/bin/ld: /tmp/ccdGBiQv.o: relocation R_X86_64_PC32 against symbol `aFunc1' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
它告诉我要使用选项-fPIC
,但我已经使用了该选项!然而,我发现使用选项-Wl,-Bsymbolic
可以成功编译。
gcc -o liba.so a.c -shared -fPIC -Wl,-Bsymbolic
很抱歉,当我尝试构建第二个库
libb.so
并使用汇编函数来调用第一个库中的函数时,问题再次出现。正在编译代码。#include <a.h>
asm(
".globl bFunc2\n\t"
".type bFunc2, @function\n\t"
"bFunc2:\n\t"
".cfi_startproc\n\t"
"call aFunc1\n\t" /* note here*/
"ret\n\t"
".cfi_endproc\n\t"
);
使用命令
gcc -o libb.so b.c liba.so -shared -fPIC -Wl,-Bsymbolic
出现错误
/usr/bin/ld: /tmp/ccaGvn5d.o: relocation R_X86_64_PC32 against symbol `aFunc1' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
因为可以看到,选项-Wl,Bsymbolic
没有起到作用。
我想知道如何构建第二个库以及为什么第一个库需要-Wl,Bsymbolic
选项。我不是汇编大师,因此不知道是否正确 - 我正在尝试构建别人的库。也许我应该使用其他选项?
call rel32
并不总是有效。此外,ASLR和其他因素意味着位移不能是链接时常量,并且链接器告诉您运行时修复(编辑机器代码以在动态链接时调整位移)不可用。这就是为什么Linux动态链接不设计允许这样做的2GiB限制。 - Peter Cordes