【发布时间】:2019-06-15 11:51:53
【问题描述】:
我的程序中有一个错误,因此它在 32 位上运行良好,但在 64 位上只能随机运行,因为程序中某处的 32 位指针被截断。
原因是如果malloc返回的内存地址在指针分配的高32位中设置了一个位,则指针变为NULL。
所以我找到了触发段错误的指针。但这不是我参与的程序(我是用户而不是开发人员),根本没有编译器警告。
因此,与其花时间我没有,如何确保 malloc 返回一个可在 32 位模式下使用的值?
【问题讨论】:
-
在这个程序中使用完整的 64 位有巨大的性能优势,所以我真的不想使用 x32。
-
the x32 ABI 对于您的用例有什么问题?长模式下的 32 位指针听起来正是您所需要的,除非您还
mmap直接使用额外的地址空间,即使您有malloc使用mmap(MAP_32BIT)?或者如果long是 32 位类型,程序无法利用 64 位寄存器?还是您实际上是指 i386,而不是 x32? -
那么带有 64 位指针的 x86-64 如何以 x32(64 位模式下的 ILP32)没有的方式提供帮助?你真的试过
gcc -mx32 -O3 -march=native吗?注意-mx32不是-m32。 -
你没有读到我写的东西。 x32 是 64 位模式。去阅读en.wikipedia.org/wiki/X32_ABI。它是用于 64 位模式 x86-64 的 ILP32 ABI。 uint64_t 适合 x32 中的单个寄存器。如果您的代码不是 64 位干净的指针,但使用大量 64 位整数数学,它可能正是您需要的。 (根据您的评论编辑进行编辑:除非您的编译器不支持 x32,否则这是一个问题。)如果您的编译器不支持 x32,那么显然您还没有尝试过...所以我认为您混淆了 x32 (
-mx32) 带有蹩脚的旧 i386 32 位代码 (-m32) -
x32 与普通的
-m64完全相同,只是指针、size_t和long是 32 位类型。它是 64位的。所以实际的障碍是你没有 x32 SVML。我同意这是一个很好的选择,但请不要再说“即使它是 64 位”之类的关于 x32 的错误。查看从 ICC16 及更高版本获得的uint64_ta+b 相同的 asm:godbolt.org/z/j8gIuh。 Intel 的编译器确实支持 x32,并且 SVML 可用于 x32 (or at least it was as of version 16.0),所以希望你可以去下载它。
标签: linux malloc x86-64 glibc 32-bit