【问题标题】:GCC -m32 flag: /usr/bin/ld: skipping incompatibleGCC -m32 标志:/usr/bin/ld:跳过不兼容
【发布时间】:2011-05-02 10:32:52
【问题描述】:

在 64 位主机上,我正在尝试使用 -m32 选项构建共享库。这些库是否可以与常规 64 位库链接?

我正在做这样的事情:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so

并收到如下错误消息:

/usr/bin/ld: skipping incompatible 64_bit_library.so

所以我的问题是:64_bit_library.so32_bit_library.so 应该如何在 64 位主机上编译,以使 32_bit_library.so 可以链接到 64_bit_library.so

【问题讨论】:

    标签: c++ gcc linker shared-libraries 32bit-64bit


    【解决方案1】:

    无法将 32 位应用程序与 64 位库链接,反之亦然。问题是指针和类型通常不能在它们之间传递。通常解决方法是生成另一个大小的子进程并使用 IPC 与该进程通信。

    这样想:如果我有一个 C 普通函数:

    extern void foo(void*); 
    

    如果它在 64 位库中,我尝试从 32 位库中调用它,指针的另一半来自哪里?

    相反,如果它在 32 位库中,而我从 64 位应用程序中调用它,我将不得不丢失调用它的指针的另一半会发生什么?

    【讨论】:

    • 如果你真的很小心,你也许可以用 typedef 玩一些游戏,用 MAP_32BIT 标志的 mmap 和共享内存段,但这太麻烦了!
    • 你能告诉我如何检查它不兼容吗?使用 readelf 也许? -- rzr.online.fr/q/gcc
    • @rzr - 最简单的检查方法是在共享对象上使用file 命令,看看它是否与您尝试使用 gcc 执行的操作相匹配。您也可以使用readelf -hobjdump -x 来解决,但我发现file 的输出更简洁。
    猜你喜欢
    • 2020-06-18
    • 2013-05-31
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2021-05-07
    • 2023-01-07
    相关资源
    最近更新 更多