1

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

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

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

仅包含 C 类型列表的 .so 文件是否可能没有 GOT/PLT?也许吧,但我不明白为什么当你可以#include一个.h文件来做到这一点时,为什么会在实践中发生这种情况!

4

1 回答 1

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

于 2017-07-18T20:41:41.327 回答