【问题标题】:SYSV vs. Linux/GNU ELF formatsSYSV 与 Linux/GNU ELF 格式
【发布时间】:2018-01-28 17:46:19
【问题描述】:

问题是在以下问题的上下文中:Why are libraries not found, even though they are clearly on the -L path?。似乎我的库和我的目标文件具有不同的 ELF 格式,这可能会导致链接器无法“找到”库。

现在,这引出了几个问题:

  1. 看来我的编译器通常会生成 SYSV ELF 文件。 (与file 核对)。然而,对于那个特定的 C++ 源,它会生成一个 Linux/GNU ELF 目标文件。我想知道为什么,所以我将该源减少为一个空的 main 方法 - 突然我得到一个 SYSV 目标文件。 C++ 源文件中的哪些内容会导致编译器切换 ELF 格式?

  2. 我不能将 Linux/GNU 与 SYSV ELF 链接在一起是真是假?

  3. 是否有强制编译器创建某种 ELF 格式的选项?

我正在使用 Cray g++ (GCC) 5.3.0 20151204。

【问题讨论】:

  • 你发现什么了吗?
  • @DustinOprea:不是这样。这个问题有一个完全不同的原因。但由于它最终在没有解决 SYSV 问题的情况下工作,我得出结论,可能可以将这些格式链接在一起。
  • 我也沿着这条路走,虽然符号明显在正确的 .so 中,但有一个加载器“符号查找错误”,并且“链接对象”显示每个 ldd 的正确文件

标签: c++ linux gcc elf


【解决方案1】:

关于问题1:答案之一似乎是STT_GNU_IFUNC类型的函数会导致编译器/链接器将对应目标文件的ELF文件格式从SYSV切换到GNU/Linux

但是,我仍然不知道如何识别对象文件中类型为 STT_GNU_IFUNC 的函数。查看GNU/Linuxobjdumpreadelfnm 的目标文件仍然没有显示STT_GNU_IFUNC 类型的单个函数。

有关STT_GNU_IFUNC 的更多信息可以在https://www.airs.com/blog/archives/403 和以下相关问题中找到:How do I compile on linux to share with all distributions?

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2011-03-07
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多