如果我们说你的项目是用一个版本的C编译器构建的,并且它的潜在目标系统提供了用另一个版本构建的共享库,那么这通常是如何接近的?特别是这是一个关于libstdc的问题.
当在同一个发行版中构建某些东西时(例如在Linux等上),它非常简单 – 一切都是用相同的编译器构建的.但是像Mozilla Firefox这样的项目如何运送二进制文件据称与许多潜在目标兼容?我知道一种方法是静态链接C依赖关系,这减少了ABI不兼容问题,并限制外部链接只限于几个C库,但是当我查看实际的Firefox二进制文件时(来自Mozilal版本的Linux x86_64),我看到了这个:
ldd firefox linux-vdso.so.1 (0x00007fff561fc000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff868c9f000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff868a9b000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff868892000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff868587000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff868286000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff86806f000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff867cc6000) /lib64/ld-linux-x86-64.so.2 (0x00007ff868ee8000)
这里Firefox动态链接libstdc.那么它如何才能在不同版本的libstdc中正常工作,或者只是假设ABI兼容性就是这样呢?