我一直在考虑这个问题,因为我发现即使像libc这样的基础库也有一个GOT / PLT,它包含一些重要的功能,比如malloc()和它的朋友。
甚至可以创建一个没有GOT / PLT的共享库吗?在学术演习之外,这样的图书馆是否会在野外出现? (如果有帮助,只考虑x86平台)
我的直觉告诉我这些问题的答案分别是“不”和“是”,但我不是百分之百肯定。
只包含C类型列表的.so文件是否可能没有GOT / PLT?也许,但我不明白为什么在实践中会发生这种情况,只要#include .h文件就可以了!
答案 0 :(得分:0)
我最终找到问题第二部分的答案,似乎是“不”。我的/ 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文件。我仍然很好奇理论是否可行,但我找到了问题实际方面的答案,所以我认为它可以帮助那些想知道同样事情的人!