首页 文章

如何将AT&T样式汇编代码移到Visual Studio和Intel样式语法?

提问于
浏览
1

我有一个非常专业的文件,用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 回答

  • 3

    那里有各种各样的混乱 .

    • 命名文件 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 )并将其作为项目中的二进制文件(仅用于链接),并在需要时使用一个小的粘合层来调用约定转换 . 但是,不允许您编辑汇编源代码 .

相关问题