在linux中预加载动态加载的库

Posted

技术标签:

【中文标题】在linux中预加载动态加载的库【英文标题】:Preloading dynamically loaded libraries in linux 【发布时间】:2014-06-18 17:00:45 【问题描述】:

我有一个 7 年前的游戏,是一个朋友制作的,而我只剩下很少的源代码了。 它在 CentOS 4.8 及更低版本上完美运行,所以我认为这是 TLS 错误。我将包含该程序调用的所有 CentOS 4.8 库的新文件夹转移到新文件夹... 我正在尝试将它在 ldd 中调用的旧库专门加载到该程序,。这就是我正在尝试的:

LD_PRELOAD="/glibs/ld-linux.so.2 /glibs/libc.so.6 /glibs/libgcc_s.so.1 /glibs/libm.so.6 /glibs/libpthread.so.0 /glibs/libstdc++.so.5 /glibs/libz.so.1 /glibs/libxml2.so.2" /home/g/gameserver

我不断收到 Segmentation Fault 错误,有人知道为什么吗?也许我不完全理解 LD_PRELOAD 做了什么。我怎样才能在不弄乱原件的情况下加载旧库? 提前致谢!

【问题讨论】:

【参考方案1】:

LD_PRELOAD 更多地用于在使用普通功能之前覆盖库中的功能(例如自定义 malloc、sockify 所有套接字等)。您可能需要将所有旧库放入它们自己的目录中,然后设置 LD_LIBRARY_PATH 以便它首先尝试在此目录中查找库。

【讨论】:

我认为这是有效的我收到此错误... java: relocation error: /glibs/libc.so.6: symbol _dl_out_of_memory,版本 GLIBC_PRIVATE 未在文件 ld-linux.so.2 中定义with link time reference 那是什么意思? 我会说你没有把所有的旧图书馆都复制到这个地方。请检查 ldd 并确保它只需要使用 LD_LIBRARY_PATH 指定的目录中的库,并且所有这些都来自旧系统。 甜,这行得通,但我不得不将 ld-linux.so/ld 降级到较低版本,以停止给我 GLIBC_PRIVATE 错误。非常感谢你的帮助!现在只是希望它不会给我其他较新程序的错误:)

以上是关于在linux中预加载动态加载的库的主要内容,如果未能解决你的问题,请参考以下文章

从动态加载的库中记录

在动态加载的库中,我的内存分配在哪里?

数据表 延迟加载数据。如何动态传递“deferLoading”值

Linux下C/C++动态库在运行时是怎样加载进来的

如何在路由中动态加载组件

Linux编程中链接库的使用