我有一个非常专业的文件,用x86-64汇编为Linux编写,在GCC下编译。我需要将该代码移动到Visual Studio项目,并且mll64.exe希望程序集文件采用Intel格式。
我试图构建一个跨平台的DLL,但它不起作用:
15:47:19 cpudiag2> gcc -shared -o my.dll my.o
/ usr / bin / ld:my.o:针对“本地符号”重新定位R_X86_64_32S 制作共享对象时不能使用;用-fPIC重新编译 my.o:无法读取符号:错误值collect2:ld返回1退出 状态
15:47:19 cpudiag2> gcc -fPIC my.S
/usr/lib/gcc/x86_64-redhat-linux/4.1.2 /../../../../ lib64 / crt1.o:In function`_start':(。text + 0x20):对'main'的未定义引用 collect2:ld返回1退出状态
然后我尝试让GCC从目标文件反编译成Intel语法,但这也不起作用。以下两个命令都导致AT& T语法中的反编译汇编代码。为什么呢?
objdump -d -M = intel my.o
gcc -S -masm = intel my.o
答案 0 :(得分:3)
那里有各种混淆。
my.dll
不会更改其格式-fPIC
不会神奇地制作手写的asm PIC,它只适用于编译器生成的代码-c
切换到gcc
(但在这种情况下这不会帮助您)gcc -S
不会反汇编目标文件,而是用于从C代码生成程序集objdump -d -M=intel my.o
应该可以工作,但它产生的东西不适合组装(尤其不适用于Windows,因为它使用不同的调用约定)您最好的选择可能是将所述代码汇编到Windows对象文件(使用针对Windows的gcc
/ gas
)并将其作为项目中的二进制文件(仅用于链接),并使用小胶水如果需要,调用约定转换的层。但是,不允许您编辑汇编源。