【Debug】ERROR: ld.so: object '/usr/local/lib/ff.so' from /etc/ld.so.preload cannot be preloaded: igno

【Debug】ERROR: ld.so: object '/usr/local/lib/ff.so' from /etc/ld.so.preload cannot be preloaded: igno_第1张图片

解决这个问题需要先了解一下Linux系统的库文件

库文件是编译好的程序,这类程序通常没有执行入口,需要其他程序的调用才会执行。

Linux 中的 so(shared object,共享对象) 也叫做动态链接库,在 Linux 中是一系列以 .so 为后缀名(后面可能还跟有版本号)的文件。与动态链接库所对应的是静态库,静态库文件是以 .a 为后缀名的文件。

使用动态链接库的程序

  • 程序在启动时操作系统会将所需的动态链接库加载到内存中供程序使用,搜索的路径是系统默认或者自定义的

  • 使用动态链接库的程序会比较小,但是使用时对操作系统环境有一定要求

  • 动态连接库在内存中是共享的,多个进程可以使用操作系统内存中的同一个动态链接库,因此一定程度上能够节省内存开销 库文件的更新不需要更新整个程序

使用静态库的程序

  • 在编译时就将静态库编译到程序内部,对操作系统环境要求较低

  • 静态库在内存中不能够共享,不能节省内存开销

  • 将静态库编译进程序,程序的体积可能较大

  • 库文件的修改需要重新编译整个程序

库文件是怎样被使用的

在基于 GNU glibc 的系统中,包括所有的 Linux 操作系统,启动一个可执行的带链接库程序时,会自动启动一个载入程序。 在Linux系统中,这个载入程序叫做 /lib/ld-linux.so.X( X是版本号 ),64 位系统中这个文件是 /lib64/ld-linux-x86-64.so.X。这个载入程序会查找并载入程序所使用的其他共享库至内存中。

共享库文件查询的目录存放在 /etc/ld.so.conf 中。注意,对于红帽 Linux 系统,/etc/ld.so.conf 这个文件中并没有包含 /usr/local/lib 这个常用的库文件目录。

如果只是想要覆盖一个库文件的某些函数,但保留其余的内容,可以将覆盖库文件名(.o 后缀文件)保存至 /etc/ld.so.preload 文件中。这些覆盖库文件会比标准库文件优先读取,这通常用于紧急的版本补丁。

每次都查找 /etc/ld.so.conf 中的目录是很低效的,因此 ldconfig 程序会读取 /etc/ld.so.conf 文件中的所有目录中的文件,将库文件 real name 设置合适的软链接 soname,并将这些文件名缓存至 /etc/ld.so.cache 中。这样会大大加快库文件的寻找速度。

特殊的库文件 linux-vdso.so,在早期的 x86 处理器中,用户程序与管理服务之间的通信通过软中断实现。 随着处理器速度的提高,这已成为一个严重的瓶颈。 自 Pentium® II 处理器开始,Intel® 引入了 Fast System Call 装置来提高系统调用速度, 即采用 SYSENTER 和 SYSEXIT 指令,而不是中断。

linux-vdso.so.1 是个虚拟库,即 Virtual Dynamic Shared Object,它只存在于程序的地址空间当中。 在旧版本系统中该库为 linux-gate.so.1。 该虚拟库为用户程序以处理器可支持的最快的方式 (对于特定处理器,采用中断方式;对于大多数最新的处理器,采用快速系统调用方式) 访问系统函数提供了必要的逻辑 。

解决问题

输出/etc/ld.so.preload会发现以下内容:

/usr/local/lib/md.so
/usr/local/lib/sh.so
/usr/local/lib/y.so
/usr/local/lib/ff.so

将这些内容删除,就不会出现以上的报错了(删除前要确认里面的内容无效)。

你可能感兴趣的:(【Debug】ERROR: ld.so: object '/usr/local/lib/ff.so' from /etc/ld.so.preload cannot be preloaded: igno)