每个.so文件都有PLT / GOT吗?



我一直在考虑这个问题,因为我观察到即使是像libc这样非常基本的库也有一个GOT/PLT,由malloc((及其朋友等重要功能组成。

是否可以创建一个没有 GOT/PLT 的共享库?这样的图书馆会在学术活动之外的野外出现吗?(如果有帮助,请专门考虑x86平台(

我的直觉告诉我,这些问题的答案分别是"否"和"是",但我不能100%确定。

仅包含 C 类型列表的 .so 文件是否有可能没有 GOT/PLT?也许吧,但我不明白为什么在实践中会发生这种情况,而您只需 #include 一个 .h 文件即可执行此操作!

我最终找到了问题的第二部分的答案,它似乎是"否"。我的/lib 目录中有不到 5500 个 .so 文件,我运行了以下 shell 脚本,称为sotest.sh

#!/bin/bash
for i in $( ls /lib ); do
objdump -d -j .plt /lib/$i &> /tmp/tmpfile.txt;
a=`grep "File format not recognized" /tmp/tmpfile.txt`
b=`grep "not an ordinary file" /tmp/tmpfile.txt`
c=`grep "not found in any input file" /tmp/tmpfile.txt`
if [ -n "$a" ]; then
echo "Invalid";
elif [ -n "$b" ]; then
echo "Invalid";
elif [ -n "$c" ]; then
echo "$i HAS NO PLT SECTION";
else
echo "$i has plt section";
fi
rm /tmp/tmpfile.txt;
done
echo "Done"

然后我跑./sotest.sh | grep "HAS NO PLT SECTION".我确实有一些结果,但都是 .a 文件,没有一个是 .so 文件。

因此,在实践中,如果没有PLT/GOT的.so文件,您似乎永远不会遇到。我仍然很好奇这在理论上是否可行,但我找到了我问题的实际方面的答案,所以我认为它可以帮助其他想知道同样事情的人!

最新更新