Linux二进制程序移植

    新系统编译的二进制程序在老系统上执行可能因 浮点异常 ( SIGFPE )而崩溃。根源在于:新版链接器生成新的 .gnu.hash 节,而不是原来的 .hash 节。老 Linux 系统不知道如何链接二进制程序,导致了这个异常。为 GCC 指定参数 -Wl,–hash-style=both 便可解决这个问题。

    如果用到 C++ 标准库,程序可能依赖一个目标系统上没有的 版本。虽然比较繁琐,但还是可以通过静态链接libstdc++来避免。

    Linux 采用 符号版本 ( )来保护 C 库向下兼容性。如果在新系统构建二进制程序,程序可能会依赖新版的 glibc 。为了确认二进制程序依赖的版本,可以运行 命令:

    如果发现有不对的版本,可以通过 nm 命令查出依赖它的符号:

    输出大致如下:

    GCC栈保护 ( stack protector )功能需要用到这个函数,而老版本的 并不提供!该功能在 FedoraUbuntu 下默认是开启的,因此为了避免 未知符号 ( missing symbol )错误,需要通过编译参数 -fnostack-protector 显式关闭。

    栈保护 功能用于应对 栈攻击 :一旦检测到便强行退出程序并输出错误信息。

    订阅更新,获取更多学习资料,请关注我们的 微信公众号

    小菜学编程