Linux汇编问题:调用外部函数

3

在Linux上:

file1.s:

.text
.globl MyFunc
Func:
        ....
 call my_jump
 ret  

file2.h:

extern "C" FUNC_NO_RETURN  void  my_jump();

file3.cpp:

extern "C" __attribute__((noinline)) void my_jump()
{
     return;
}

当我链接我的调用“MyFunc”的模块时,我遇到了以下错误:(之前在汇编代码中添加对my_jump的调用之前,一切都很好)
“针对'longjmp_hack'的R_X86_64_PC32重定位无法在制作共享对象时使用;重新编译时请使用-fPIC”
有什么想法吗?

需要更多信息:
  • 您使用GCC还是直接使用LD链接对象?此外,您使用哪些命令行参数?
  • 为什么要使用“attribute((noinline))”语句?
- Jeroen Jacobs
3
你试过使用-fPIC重新编译吗? - Paul R
我正在使用g++进行链接。我发现我需要在file2.h中添加__attribute__ ((visibility ("hidden")))来声明我的函数。然而,我无法弄清楚为什么需要这样做,因为据我所读,此标志应该将不同的函数声明聚合到共享对象中的同一对象,但我只定义了此函数一次! - sramij
1个回答

1

从 file2.h 中移除 FUNC_NO_RETURN

例如:file2.h:

extern "C" void my_jump();

file4.c:

#include "file2.h"  
extern "C" void MyFunc();  
main(){  
   MyFunc();  
}

并修复 file1.s 中的拼写错误:

.text  
.globl MyFunc  
MyFunc:  
  call my_jump  
  ret  

对我来说,所有的编译都很顺利...

g++ file1.s file3.cpp file4.c -o a.out

编译器版本:

$ g++ --version
g++ (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)

Linux 版本:3.1.5-6.fc16.x86_64


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接