我有一个需要mkdirp的系统“fsimage.so”,它恰好存在于libgen.so中。但fsimage.so不知道这一点。例如:
# ldd /usr/lib/python2.4/vendor-packages/fsimage.so
libfsimage.so.1.0 => /usr/lib/libfsimage.so.1.0
libxml2.so.2 => /lib/libxml2.so.2
libgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1
libpthread.so.1 => /lib/libpthread.so.1
libz.so.1 => /lib/libz.so.1
libm.so.2 => /lib/libm.so.2
libsocket.so.1 => /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
# ./test
Traceback (most recent call last):
File "./test", line 26, in ?
import fsimage
ImportError: ld.so.1: isapython2.4: fatal: relocation error: file /usr/lib/python2.4/vendor-packages/fsimage.so: symbol mkdirp: referenced symbol not found
# LD_PRELOAD=/usr/lib/libgen.so ./test
Usage: ./test
当然,如果我有源等,我可以简单地再次链接它,并添加“-lgen”,它将添加libgen.so作为依赖。
但是作为hackery的练习,说我没有任何资源,只是想添加fsimage.so还需要加载libgen.so。使用elfedit / objcopy等,这是不可能的?我不认为我可以使用“ld”来使用.so作为输入,并用额外的库编写一个新的.so吗?
# elfdump /usr/lib/python2.4/vendor-packages/fsimage.so|grep NEEDED
[0] NEEDED 0x5187 libfsimage.so.1.0
[1] NEEDED 0x5152 libxml2.so.2
[2] NEEDED 0x5171 libgcc_s.so.1
第一次尝试stackoverflow,对我很轻松:)
答案 0 :(得分:10)
谢谢你“就业俄语”,你给了我更深入搜索所需的信息。 Solaris已附带“elfedit”,因此如果其他人想知道,这些是指令
# elfedit libfsimage.so.1.0.0 libfsimage.so.1.0.0-new
> dyn:value DT_NEEDED
index tag value
[0] NEEDED 0x4f81 libpthread.so.1
[1] NEEDED 0x4fac libxml2.so.2
[2] NEEDED 0x4fc2 libgcc_s.so.1
> dyn:value -add -s DT_NEEDED libscf.so
index tag value
[35] NEEDED 0x500d libscf.so
> dyn:value DT_NEEDED
index tag value
[0] NEEDED 0x4f81 libpthread.so.1
[1] NEEDED 0x4fac libxml2.so.2
[2] NEEDED 0x4fc2 libgcc_s.so.1
[35] NEEDED 0x500d libscf.so
> :write
> :quit
# ldd libfsimage.so.1.0.0-new
libpthread.so.1 => /lib/libpthread.so.1
libxml2.so.2 => /lib/libxml2.so.2
libgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1
libscf.so => /lib/libscf.so
libz.so.1 => /lib/libz.so.1
libm.so.2 => /lib/libm.so.2
libsocket.so.1 => /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libuutil.so.1 => /lib/libuutil.so.1
libgen.so.1 => /lib/libgen.so.1
libnvpair.so.1 => /lib/libnvpair.so.1
libsmbios.so.1 => /usr/lib/libsmbios.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
答案 1 :(得分:7)
不容易。
大多数UNIX
系统(AIX
是一个值得注意的例外)将*.so
视为“最终”链接产品,并且它不适合作为任何其他链接的输入。
要向fsimage.so
的动态部分添加新的DT_NEEDED标记,您需要重写其.dynamic
部分。从.dynamic
删除条目相对容易 - 您只需“滑动”其他条目,并将最后一个条目替换为DT_NULL
。
另一方面,添加新条目需要在文件中附加一个全新的.dynamic
部分,然后更新fsimage.so
中的所有指针(偏移)以指向新部分。这需要“深入”理解ELF格式。
现有工具可以做到这一点,例如rpath
但我的成功并不多。
答案 2 :(得分:1)
您可以使用PatchELF。 0.9版本已于2016年2月29日发布,并允许您:
在你的情况下:
$ patchelf --add-needed /usr/lib/libgen.so /usr/lib/python2.4/vendor-packages/fsimage.so