C 在加载共享对象时,有没有办法告诉链接器忽略DT_SONAME?

C 在加载共享对象时,有没有办法告诉链接器忽略DT_SONAME?,c,linux,linker,C,Linux,Linker,曼氏说: -soname=名称 创建ELF共享对象时,将内部DT_SONAME字段设置为指定名称。当可执行文件与 具有DT_SONAME字段的共享对象,然后在 运行动态链接器将尝试加载共享对象 由DT_SONAME字段指定,而不是使用文件名指定 交给链接器 是否可以覆盖此语句的后半部分?换句话说,在运行可执行文件时,是否可以强制链接器忽略外部共享库的DT_SONAME,而只使用文件名 换句话说,在运行可执行文件时,是否可以强制链接器忽略外部共享库的DT_SONAME,而只使用文件名 没有 首先,

曼氏说:

-soname=名称 创建ELF共享对象时,将内部DT_SONAME字段设置为指定名称。当可执行文件与 具有DT_SONAME字段的共享对象,然后在 运行动态链接器将尝试加载共享对象 由DT_SONAME字段指定,而不是使用文件名指定 交给链接器

是否可以覆盖此语句的后半部分?换句话说,在运行可执行文件时,是否可以强制链接器忽略外部共享库的DT_SONAME,而只使用文件名

换句话说,在运行可执行文件时,是否可以强制链接器忽略外部共享库的DT_SONAME,而只使用文件名

没有

首先,链接器不参与可执行文件的运行,加载程序也被称为动态链接器。加载器是一个完全独立的程序,通常不共享代码,与链接器完全不同

其次,链接器完成后,用于链接可执行文件的文件名不会记录在任何地方,只记录DT_SONAME。因此,即使加载程序想要使用原始文件名,也无法找到它是什么

也就是说,您可以更改记录DT_SONAME的可执行文件的.dynstr部分中的字符串。如果字符串是say foobar.so.1,而您将其二进制编辑为barfoo.so,则加载程序将使用其常用的共享库搜索规则(而不是foobar.so.1)查找barfoo.so。这里唯一的限制是新名称不比旧名称长,否则会损坏其他字符串


也可以用长字符串替换.dynstr部分,用/full/path/to/libsomething.so替换foobar.so.1,但这种转换更难正确执行。

非常好的答案。谢谢