我正在尝试分析我们的共享库,但是每当我设置了环境变量 LD_PROFILE 时,我都会得到“PLTREL not found in object”。是什么赋予了?我是否缺少某种链接器标志或什么?互联网上似乎没有关于此的信息。sprof 的手册页长约 10 个字。
2 回答
根据Google Groups 上未回答的问题,您似乎不是第一个遇到此问题的人。
我认为 pltrel 意味着plt- relative ;在一些ELF 设计说明中,
在代码段中创建了一个 .plt 部分,它是一个函数存根数组,用于处理库调用的运行时解析。
还有一点:
我要提到的下一部分是 .plt 部分。这包含我们调用共享库中的函数时使用的跳转表。默认情况下,.plt 条目全部由链接器初始化,不指向正确的目标函数,而是指向动态加载器本身。因此,第一次调用任何给定函数时,动态加载程序会查找该函数并修复 .plt 的目标,以便下次使用此 .plt 插槽时,我们调用正确的函数。进行此更改后,动态加载程序会调用该函数本身。
在我看来,共享库的编译或组装方式存在问题。希望对 elf PLT 部分的更多搜索能让您走上正轨。
发现这可能与您相关:
LD_AUDIT 的已知问题
➢ LD_AUDIT 不适用于没有代码的共享库。
➢ 示例 ICU-4.0 “libicudata.so”</p>
➢ 错误:“no PLTREL found in object /usr/lib/libicudata.so.40”</p>
➢ 通过 sed'ing -nostdlib etc away 修补 libicudata 后重新编译 sed -i -- "s/-nodefaultlibs -nostdlib//" config/mh-linux
似乎同样适用于 LD_PROFILE