本文来自CSDN博客,转载请标明出处。
水平有限,翻译错误处盼不吝指正。
原文:http://www.wiredrevolution.com/system-administration/select-threading-implementation-using-ld_assume_kernel
为了实现向后兼容,许多Linux发行版支持旧的LinuxThreads实现以及新的本地POSIX线程库(NPTL)。通过设置LD_ASSUME_KERNEL环境变量,动态链接器将假定它是运行在一个特定的内核版本上。这将覆盖程序在运行时,动态链接器默认选择的线程实现(通常是NPTL),而强行使用旧的LinuxThreads实现。
许多32位Linux系统有3个独立的glibc版本,每个版本都指定其最低的操作系统的应用程序二进制接口(ABI),包括内核版本和所提供的线程实现模型。一般在如下三个目录:/lib/tls , /lib/i686 , /lib 。
/lib/tls/libc.so.6:
最低的ABI = 2.4.20
本机POSIX线程库(NPTL)
/lib/i686/libc.so.6:
最低的ABI = 2.4.1
标准的LinuxThreads,动态线程栈大小
/lib/libc.so.6
最低的ABI = 2.2.5
早期的LinuxThreads,固定线程栈大小
注意:64位系统不支持旧2.2.5 LinuxThreads实现。
你可能通过下面的命令来确定你的系统所支持的各个glic库的线程实现模型:
$ /lib/tls/libc.so.6 | grep [T|t]hreads
Native POSIX Threads Library by Ulrich Drepper
$ /lib/i686/libc.so.6 | grep [T|t]hreads
linuxthreads-0.10 by Xavier Leroy
$ /lib/libc.so.6 | grep [T|t]hreads
linuxthreads-0.10 by Xavier Leroy
动态库(共享库,*.so)可以告知动态链接器它能够正常运行所必需的最低的操作系统的应用程序二进制接口(ABI)版本。的你的程序运行时,动态链接器会根据最近的动态库查找路径并依次查找:/lib/tls , /lib/i686 , /lib。它会链接找到第一个满足最低ABI版本要求的库,或者无法找到满足最低ABI版本的库,链接失败并终止程序。
设置LD_ASSUME_KERNEL低于任何glibc动态库版本的最低要求的ABI版本,这样链接器将跳过该glibc库,并尝试找到一个比该版本更旧的线程实现的glibc库。
我们可以设置该环境变量,假定当前操作系统是一个特定的ABI /内核版本。这样可以达到跳过默认顺序链接的线实现 ,而使用特定版本库的线程实现。
$ export LD_ASSUME_KERNEL=X.Y.Z
注意:不要设置环境变量值为ABI低于2.2.5,这样会导致使用了动态链接库的程序无法正常运行。不过设置错误了也不用担心,你可以马上改回环境变量原来的值。
大多数程序并不关心底层的库是哪种实现,这样即便设置 LD_ASSUME_KERNEL变量也没作用。因为库的版本不同,但提供的API相同。但也有些应用程序因某些不符合规范的操作而需要使用LinuxThreads线程实现,NPTL线程实现会导致运行失败。这种情况下就可通过 LD_ASSUME_KERNEL环境变量实现动态链接器跳过NPTL库的目的。