假设我有libA.so和libB.so,有什么办法可以将它们组合到单个共享库libC.so中,其中包含libA.so和libB.so的所有导出符号?

评论

我假设您没有这些库的源代码(只是为了使事情更清楚!)。但是,您可以访问它的静态版本(* .a)吗?

不,我既没有源代码,也没有静态版本。

#1 楼

坦率地说,这不是RCE,而是开发(即StackOverflow)问题,但让我给出您可以根据问题中提供的信息水平提供的建议。您要实现的是通过所有方法通过单个库提供这些符号,或者您是否不在乎如何将两组符号都提供给您的程序。

在库上,您可以简单地编写一个共享库,并通过浅层包装函数从中导出符号,但是使用动态加载程序从原始共享库中找到它们(请参阅ldd和相关手册页)。用readelf --dyn-syms <elf-file> / readelf --syms --use-dynamic <elf-file>(在Ubuntu / Debian上的软件包是elfutils)找到所有符号名称并不是很难。从输出的结果中,您可以编写一个用于链接程序的版本脚本(例如gcc -Wl,--version-script,script.map ...)。

但是,假设您使用的是默认Linux功能且没有任何其他魔术,则也可以滥用ld-linux / ld.so定位符号的方法。如果编写设置LD_PRELOAD的简单包装器外壳脚本,则可以简单地预先加载两个共享对象,并且在正常情况下,它们应优先于其他符号。我也强烈建议您阅读Michael Kerrisks优秀著作“ Linux和Unix系统编程权威指南”的第41章和第42章,俗称TLPI。在您的情况下,相应的源样本也可能派上用场。