Linux 根据$LD\u库路径和架构选择库
为了演示,我制作了两个文件夹,其中包含两个版本的libgccs.so.1 我根据ldd寻找图书馆选择:Linux 根据$LD\u库路径和架构选择库,linux,architecture,ldd,Linux,Architecture,Ldd,为了演示,我制作了两个文件夹,其中包含两个版本的libgccs.so.1 我根据ldd寻找图书馆选择: > file {A,B}/libgcc_s.so.1 A/libgcc_s.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped B/libgcc_s.so.1: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stri
> file {A,B}/libgcc_s.so.1
A/libgcc_s.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped
B/libgcc_s.so.1: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped
> LD_LIBRARY_PATH=A:B ldd MyProgram | grep libgcc_s.so.1
libgcc_s.so.1 => B/libgcc_s.so.1
为什么MyProgram不使用A/libgcc_.so.1?
我知道这是一个架构问题,但a/libgcc_.so.1如何被视为无效,我如何手动测试它?第三个字段是“machine”,它的值62表示amd64(x86_64),3表示i386(80386)。加载程序当然会检查此字段,以确定它是否可以使用给定的库,如果不能,它将继续到其搜索列表中的下一个路径。Ok,但如何确定库是否符合当前的体系结构?我可以得到ELF的18-19字节,但我不知道如何确定该代码是否符合我的实际架构。做[$(readelf-h | grep$(Machine:)=*$(uname-i)*]]是安全的吗?在更高的层次上,您试图实现的实际目标是什么?我在不同的平台上共享了包含不同体系结构的不同库的文件夹。我的实际LD_LIBRARY_路径包括所有这些。我想根据体系结构减少它,只使用有用的文件夹,而不使用任何命名约定。然后我认为应该使文件夹命名为与
uname-m
(例如x86_64)的输出相同的文件夹。然后,当然,扫描readelf或file(1)
或其他任何文件的输出,并进行字符串匹配。这似乎比命名惯例更糟糕,但这只是我的观点。