【发布时间】:2011-01-20 10:20:53
【问题描述】:
在 Linux 上
file1.s:
.text
.globl MyFunc
Func:
....
call my_jump
ret
文件2.h:
extern "C" FUNC_NO_RETURN void my_jump();
file3.cpp:
extern "C" __attribute__((noinline)) void my_jump()
{
return;
}
链接调用“MyFunc”的模块时,我收到以下错误:(之前在 asm 代码中添加对 my_jump 的调用之前,一切正常)
"relocation R_X86_64_PC32 against 'longjmp_hack' can not be used when making a shared object; recompile with -fPIC"
有什么想法吗?
【问题讨论】:
-
需要更多信息: - 您使用 GCC 还是直接使用 LD 来链接对象?另外,您使用哪些命令行参数? - 为什么是“attribute((noinline))”语句?
-
你尝试用
-fPIC重新编译了吗??? -
我正在使用 g++ 进行链接。我发现我需要在 file2.h 中添加 attribute ((visibility ("hidden"))) 我的函数声明。但是,我不知道为什么需要它,因为我在阅读此标志时假设将不同的函数声明聚合到共享对象链接中的同一对象,但我只定义了一次此函数!