我有一个非常专业的文件,用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:在函数
_start'中:( . text 0x20):未定义引用
main'colle2:ld返回1退出状态
那么我试着让GCC从目标文件反编译成Intel语法,但这也不起作用 . 以下两个命令都会导致AT&T语法中的反编译汇编代码 . 为什么?
objdump -d -M = intel my.o gcc -S -masm = intel my.o
1 回答
那里有各种各样的混乱 .
命名文件
my.dll
不会更改其格式由于linux和windows上的库格式不同,你无法制作跨平台的dll
-fPIC
不会神奇地制作手写的asm PIC,它只适用于编译器生成的代码要获取一个目标文件,你应该将
-c
切换到gcc
(但在这种情况下这对你没用)gcc -S
doesn 't disassemble an object file, it'用于从C代码生成程序集objdump -d -M=intel my.o
应该可以工作,但它产生的东西不适合组装(尤其不适用于windows,因为它使用不同的调用约定)您最好的选择可能是将所述代码汇编到Windows对象文件(使用针对Windows的
gcc
/gas
)并将其作为项目中的二进制文件(仅用于链接),并在需要时使用一个小的粘合层来调用约定转换 . 但是,不允许您编辑汇编源代码 .