Objcopy 获取目标文件 64 位二进制文​​件

Posted

技术标签:

【中文标题】Objcopy 获取目标文件 64 位二进制文​​件【英文标题】:Objcopy getting object file 64 bit binaries 【发布时间】:2019-06-15 14:15:43 【问题描述】:

我在 Windows 10 上使用 objcopy 将我的 dll 嵌入到 exe 中并加载它。使用 32 位二进制 dll 文件进行 32 位编译时,它运行良好,因为加载我的 dll 时没有错误。

objcopy --prefix-symbol=_ --input-target binary --output-target pe-i386 --binary-architecture i386 somedll.dll somedll.o

如何设置 objcopy 参数以便获得 64 位二进制对象文件?如果objcopy 不可能,还有其他选择吗?当我将它编译为 64 位时,我的 dll 没有被加载,如果我尝试使用 64 位的目标文件编译可执行文件,它会返回错误,指出我的目标文件与 64 位编译不兼容。

例如,在 gcc 编译期间,我必须这样做

gcc -m32 Myfile.c somedll.o -o output.exe

如果我删除 -m32 它不会编译,因为 somedll.o 设置为 32 位,即使它在 dll 中是 64 位,所以这就是为什么我的 LoadLibrary() 函数无法加载它。

【问题讨论】:

【参考方案1】:

我能够通过这个论点得到最好的结果。

objcopy --prefix-symbol=_ --input-target binary --output-target pe-x86-64 --binary-architecture i386:x86-64 some64.dll some64.o

切换pe-i386pe-x86-64i386i386:x86-64 使我能够将我的64 位dll 嵌入到我的可执行文件中,而不会遇到任何二进制兼容性问题。它在 Windows 上运行良好。

【讨论】:

以上是关于Objcopy 获取目标文件 64 位二进制文​​件的主要内容,如果未能解决你的问题,请参考以下文章

为啥 32 位内核可以运行 64 位二进制文​​件?

是否可以重新定位二进制文​​件?

无法在 64 位 Debian 上运行 32 位二进制文​​件

如何使用 npm 在 64 位系统上构建 32 位二进制文​​件?

使用 objcopy 将文本文件添加到二进制文件,但 objcopy 抱怨架构

gcc:在 32 位平台上编译 64 位二进制文​​件