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

时间:2017-07-18 15:37:16

标签: x86 plt got

我一直在考虑这个问题,因为我发现即使像libc这样的基础库也有一个GOT / PLT,它包含一些重要的功能,比如malloc()和它的朋友。

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

我的直觉告诉我这些问题的答案分别是“不”和“是”,但我不是百分之百肯定。

只包含C类型列表的.so文件是否可能没有GOT / PLT?也许,但我不明白为什么在实践中会发生这种情况,只要#include .h文件就可以了!

1 个答案:

答案 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文件。我仍然很好奇理论是否可行,但我找到了问题实际方面的答案,所以我认为它可以帮助那些想知道同样事情的人!