gpt4 book ai didi

C++ 符号在共享对象中具有不同的大小

转载 作者:IT王子 更新时间:2023-10-29 00:25:50 25 4
gpt4 key购买 nike

我一直致力于开发一个跨平台窗口库,专门用于 OpenGL,目前专注于 Linux。我正在使用 glload 来管理 OpenGL 扩展,并且正在将其与我稍后将使用的其他库一起编译到 .so 中。这个 `.so 正如您所期望的那样被动态加载,但在运行时程序会给出以下输出(手动换行以便于阅读):

_dist/x64-linux-debug/bin/test: Symbol `glXCreateContextAttribsARB' has \
different size in shared object, consider re-linking

现在,显然我已经尝试过重新链接,甚至多次重建整个项目(进行测试,而不是盲目地希望它会神奇地让一切变得更好)。该程序似乎确实愿意运行,因为它会像我期望的那样产生一些日志输出。我已使用 nm 确认“符号”在 .so

nm _dist/x64-linux-debug/lib64/libvendor.so | grep glXCreateContextAttribsARB
00000000009e0e78 B glXCreateContextAttribsARB

如果我使用 readelf 查看正在定义的符号,我会得到以下结果(同样,为了格式化,我手动换行了前三行):

readelf -Ws _dist/x64-linux-debug/bin/test \
_dist/x64-linux-debug/lib64/libvendor.so | \
grep glXCreateContextAttribsARB
348: 000000000062b318 8 OBJECT GLOBAL DEFAULT 26 glXCreateContextAttribsARB
421: 000000000062b318 8 OBJECT GLOBAL DEFAULT 26 glXCreateContextAttribsARB
1370: 00000000009e0e78 8 OBJECT GLOBAL DEFAULT 25 glXCreateContextAttribsARB
17464: 00000000009e0e78 8 OBJECT GLOBAL DEFAULT 25 glXCreateContextAttribsARB

恐怕这就是我所能提供的全部帮助,因为我真的不知道要尝试或研究什么。就像我说的,我确信需要更多的信息,所以请只说我会提供我能提供的。我正在从我的项目根目录运行这些命令,以防您想知道。

最佳答案

wilsonmichaelpatrick 的回答大部分是正确的,但使用 gdb 可能不是找到问题的最快方法,如果您有非调试构建,则可能根本不起作用。

首先,您应该确认确实存在问题:

readelf -Ws _dist/x64-linux-debug/bin/test _dist/x64-linux-debug/lib64/libvendor.so |
grep glXCreateContextAttribsARB

这应该显示在 testlibvendor.so 中定义的符号,具有不同的大小。

其次,使用 -Wl,-y,glXCreateContextAttribsARB 标志重新链接 testlibvendor.so。这将告诉您哪些目标文件(或库)提供了(不同的)定义。

最后,使用 -E-dD 标志对生成上述目标文件的源进行预处理,看看它们之间有什么不同。

更新:

I need help digesting what it is saying

不要无助。阅读 man readelf,或者手动运行它。你会看到这样的东西:

readelf -Ws /bin/date | head -5

Symbol table '.dynsym' contains 75 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __ctype_toupper_loc@GLIBC_2.3 (2)

这会告诉您所获得数据的含义。特别是,这告诉您 testlibvendor.so 中的符号大小相同 (8)。因此,问题不在这两个 ELF 文件中,而是在其他地方。在您的其他 库上运行readelf,并查找具有不同大小的glXCreateContextAttribsARB 的定义。然后执行其余过程。

关于C++ 符号在共享对象中具有不同的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com