问题是在以下问题的上下文中:为什么找不到库,即使它们显然位于 -L 路径上?。看来我的库和目标文件具有不同的 ELF 格式,这可能会导致链接器无法“找到”库。
现在,这引出了几个问题:
看来我的编译器正常生成SYSV ELF文件。 (用
file
检查)。但是,对于特定的 C++ 源代码,它会生成 Linux/GNU ELF 目标文件。我想知道为什么,所以我将该源减少为一个空的主方法 - 突然我得到了一个 SYSV 对象文件。 C++ 源文件中的什么内容可以导致编译器切换 ELF 格式?我无法将Linux/GNU与SYSV ELF链接在一起是真是假?
是否有一个选项可以强制编译器创建某种ELF格式?
我正在使用 Cray g++ (GCC) 5.3.0 20151204。
关于问题1:答案之一似乎是
STT_GNU_IFUNC
类型的函数将导致编译器/链接器将相应目标文件的ELF
文件格式从SYSV
切换为GNU/Linux
。
但是,我仍然不知道如何识别目标文件中类型为
STT_GNU_IFUNC
的函数。查看 GNU/Linux
与 objdump
、readelf
和 nm
的目标文件仍然没有显示 STT_GNU_IFUNC
类型的单个函数。
有关
STT_GNU_IFUNC
的更多信息可以在 https://www.airs.com/blog/archives/403 以及以下相关问题中找到:如何在 Linux 上编译以与所有发行版共享?