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 反对 `a local symbol' 在制作共享对象时不能使用;使用 -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):未定义的引用to `main' collect2: ld 返回 1 退出状态

因此,我尝试让 GCC 从目标文件反编译为 Intel 语法,但这也不起作用。以下两个命令都会产生 AT&T 语法中的反编译汇编代码。为什么?

objdump -d -M=intel my.o

gcc -S -masm=intel my.o

4

1 回答 1

3

那里有各种混乱。

  1. 命名文件my.dll不会改变其格式
  2. 由于 linux 和 windows 上的库格式不同,所以不能制作跨平台的 dll
  3. -fPIC不会神奇地制作手写 asm PIC,它只适用于编译器生成的代码
  4. 要获取目标文件,您应该将-cswitch 传递给gcc(但在这种情况下这对您没有帮助)
  5. gcc -S不反汇编目标文件,它用于从 C 代码生成汇编
  6. objdump -d -M=intel my.o应该可以工作,但它产生的东西不适合组装(尤其是在 Windows 上,因为它使用不同的调用约定)

您最好的选择可能是将所述代码组装到 windows 目标文件(使用gcc/gas以 windows 为目标)并将其作为二进制文件包含在您的项目中(仅用于链接),并在需要时使用一个小的粘合层来调用约定转换。但是,不允许您编辑程序集源。

于 2012-10-22T23:30:21.533 回答