使用 gcc 32bit 编译,作为带有 -m64 的 64 位程序
Posted
技术标签:
【中文标题】使用 gcc 32bit 编译,作为带有 -m64 的 64 位程序【英文标题】:compiling using gcc 32bit, as a 64 bit program with -m64 【发布时间】:2015-04-09 07:51:38 【问题描述】:我有 32 位 gcc。由于我所有的第三方库都是 64 位的,并且由于项目限制,我必须在 solaris 中将我的应用程序构建为 64 位。
希望我可以在 32 位 gcc 编译器中使用 -m64 选项来实现这一点。
但我不确定仅此一项是否足以成功构建。
即使我将 -m64 用于 32 位编译器,我也会反复收到 wrong ELF class: ELFCLASS64
错误。我发现这是由于 32/64 位库不匹配造成的。
以下是我的gcc 32bit lib目录的内容
ls -ltr /xxx/xxx/gcc/32-bit/4.4.1/lib/
4096 Aug 17 2009 gcc
894 Aug 17 2009 libsupc++.la
574980 Aug 17 2009 libsupc++.a
5670284 Aug 17 2009 libstdc++.so.6.0.12
960 Aug 17 2009 libstdc++.la
7507622 Aug 17 2009 libstdc++.a
4096 Aug 17 2009 debug
26504 Aug 17 2009 libssp.so.0.0.0
933 Aug 17 2009 libssp.la
44866 Aug 17 2009 libssp.a
915 Aug 17 2009 libssp_nonshared.la
2402 Aug 17 2009 libssp_nonshared.a
228812 Aug 17 2009 libgcc_s.so.1
3081544 Aug 17 2009 libgfortran.so.3.0.0
972 Aug 17 2009 libgfortran.la
4360794 Aug 17 2009 libgfortran.a
611750 Aug 17 2009 libiberty.a
4096 Aug 17 2009 amd64
170 Aug 17 2009 libgomp.spec
247908 Aug 17 2009 libgomp.so.1.0.0
945 Aug 17 2009 libgomp.la
333476 Aug 17 2009 libgomp.a
13 Aug 17 2009 libgcc_s.so -> libgcc_s.so.1
20 Aug 17 2009 libgfortran.so -> libgfortran.so.3.0.0
20 Aug 17 2009 libgfortran.so.3 -> libgfortran.so.3.0.0
16 Aug 17 2009 libgomp.so -> libgomp.so.1.0.0
16 Aug 17 2009 libgomp.so.1 -> libgomp.so.1.0.0
15 Aug 17 2009 libssp.so -> libssp.so.0.0.0
15 Aug 17 2009 libssp.so.0 -> libssp.so.0.0.0
19 Aug 17 2009 libstdc++.so -> libstdc++.so.6.0.12
19 Aug 17 2009 libstdc++.so.6 -> libstdc++.so.6.0.12
所有这些 C++ 库都是 32 位的,不是吗?我需要找到他们的 64 位等价物才能成功构建吗?
【问题讨论】:
All these C++ libraries are 32 bit isnt it? do I need to find their 64 bit equivalent to succcesfully build?
是的,是的。
嗯,我想知道 -m64 标志的目的是什么。如果我们仍然需要 64 位 gcc 编译器附带的 64 位 C++ 库,那么 -m64 标志就没有意义了,它应该使我们能够使用 32 位编译器来构建 64 位二进制文件。我在这里遗漏了什么吗?
@vibz:如果我仍然需要查找要浏览的网页,我认为拥有网络浏览器没有意义。 -m64
告诉编译器生成 64 位代码,它不会凭空创建所有 64 位的依赖库,你需要得到这些。
在 amd64
子目录中查找 64 位等效项。
@alanc:谢谢。是的,我在 amd64 subdirectory.cheers 中找到了它们
【参考方案1】:
“-m64”标志告诉编译器生成一个 64 位对象。无论生成二进制文件的编译器的 ELF 类是什么,都需要用于 64 位二进制文件的 64 位库。给您错误的库的完整路径是什么?您可能需要更改一些编译器/链接器参数和/或环境变量才能选择正确的 64 位库。
好的,这与您的问题没有直接关系,但请查看使用 Oracle 的 Solaris Studio 下载和编译。
Studio C++ 编译器有一个“-xport64”选项,该选项非常适合检测 64 位代码的问题,尤其是开发人员编写的代码,他们习惯于 32 位 ILP32 模型,以至于他们执行诸如填充指针或 size_t 值之类的事情不假思索地变成 int 变量。我知道没有真正简单的方法可以让 GCC 发出一组仅与 64 位相关的编程错误/警告。
如果您使用“-xport64”编译您的 C++ 代码,您可能会对看到的警告和错误感到震惊。
【讨论】:
以上是关于使用 gcc 32bit 编译,作为带有 -m64 的 64 位程序的主要内容,如果未能解决你的问题,请参考以下文章
mingw64 的 gcc 不使用 mingw 套件的汇编程序