【发布时间】:2011-03-10 19:02:18
【问题描述】:
假设所有 32 位库都存在,似乎大多数 32 位应用程序将在 64 位 Linux 上运行。但在我看来,依赖于架构的函数可能存在问题,这里我正在考虑信号和 setjmp/longjmp。我想知道是否有经验的人可以评论哪些功能(如果有)会导致 32 位应用程序与 64 位操作系统不兼容。
【问题讨论】:
标签: c++ linux 32bit-64bit
假设所有 32 位库都存在,似乎大多数 32 位应用程序将在 64 位 Linux 上运行。但在我看来,依赖于架构的函数可能存在问题,这里我正在考虑信号和 setjmp/longjmp。我想知道是否有经验的人可以评论哪些功能(如果有)会导致 32 位应用程序与 64 位操作系统不兼容。
【问题讨论】:
标签: c++ linux 32bit-64bit
即使setjmp 和longjmp 也应该可以正常工作。没有来自用户空间应用程序的特定问题会出现任何问题。实际的 32 位仿真由处理器完成。系统调用是返回 64 位内核的接口,Linux 可以正确处理。
如果应用程序是邪恶的,并将可执行代码发送到另一个 64 位进程执行,那么各种事情都会崩溃。
【讨论】:
对于在 64 位系统上运行的 32 位应用程序来说,最大的问题是程序员错误地假设整数或指针长度,然后用它们做不可移植的事情。 Sun 的this article 中对 C/C++ 程序员需要考虑的问题进行了很好的概述
【讨论】:
如果在没有 32 位传统支持的情况下编译 Linux,您的 32 位程序将无法正常运行。
【讨论】:
假设您有必要的 32 位库,在 64 位 Linux 下运行 32 位应用程序实际上只会出现两个问题:
在 64 位内核上由 32 位用户进程使用时,一些用于较少使用的驱动程序的 ioctl()s 无法正常工作;
如果 32 位库位于其他位置,则具有硬编码 /usr/lib 和/或 /lib 路径以搜索动态库的应用程序将无法工作。
【讨论】:
让我们举一个 32 位应用程序的例子,它有一个主模块并加载一个 32 位依赖的 dll。如果您同时迁移主模块和 32 位相关 dll,则该应用程序在 64 位机器上运行良好。但是如果您只迁移主模块,即使存在,它也无法从 64 位机器加载 64 位依赖 dll。 原因是——
数据在内存中的不同对齐方式
数据类型大小的差异
请参考:
http://dev-faqs.blogspot.com/2008/03/accessing-32-bit-dlls-from-64-bit-code_02.html
这可能就是你要找的东西!
【讨论】: