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

X86 每个.so文件都有PLT/GOT吗?,x86,plt,got,X86,Plt,Got,我考虑这个问题已经有一段时间了,因为我观察到,即使是像libc这样真正基础的库也有一个get/PLT,它包含了一些重要的功能,比如malloc()和它的朋友 甚至可以创建一个没有GET/PLT的共享库吗?这样一个图书馆会在学术活动之外的野外出现吗?(如果有帮助,只考虑x86平台) 我的直觉告诉我这些问题的答案分别是“否”和“是”,但我对这两个问题都不是100%肯定 一个只包含C类型列表的.so文件是否有可能没有get/PLT?也许吧,但我不明白为什么在实践中会出现这种情况,因为您可以只包含一个.

我考虑这个问题已经有一段时间了,因为我观察到,即使是像libc这样真正基础的库也有一个get/PLT,它包含了一些重要的功能,比如malloc()和它的朋友

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

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


一个只包含C类型列表的.so文件是否有可能没有get/PLT?也许吧,但我不明白为什么在实践中会出现这种情况,因为您可以只包含一个.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“没有PLT节”
。我确实有一些结果,但都是.a文件,没有.so文件


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

我最后找到了问题第二部分的答案,答案似乎是“不”。我的/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“没有PLT节”
。我确实有一些结果,但都是.a文件,没有.so文件


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

.so文件不能包含类型列表,因为类型不生成任何目标代码。(除非您有调试信息。)因此,只包含类型定义的源文件与空源文件相同。与C完全无关。不要发送垃圾邮件。@rici:您的意思是
。所以
文件?在许多语言中,源文件只能有类型定义,它们不是空的。@鲁迪:如果你认为一个方法的实现是类型定义的一部分,那当然是某些语言,但是这个问题说“C类型”,当我看到它时,它被标记了。在这种情况下,我认为我的陈述是站在这里的。@ RICI:我认为任何类型的定义都是一个类型定义。可以是结构、数组、枚举等。在C中,头文件也是源文件,它当然只能包含类型定义。因此,如果您可能指的是
.so
文件,而不是源文件,那么我的问题是.so文件不能包含类型列表,因为类型不生成任何目标代码。(除非您有调试信息。)因此,只包含类型定义的源文件与空源文件相同。与C完全无关。不要发送垃圾邮件。@rici:您的意思是
。所以
文件?在许多语言中,源文件只能有类型定义,它们不是空的。@鲁迪:如果你认为一个方法的实现是类型定义的一部分,那当然是某些语言,但是这个问题说“C类型”,当我看到它时,它被标记了。在这种情况下,我认为我的陈述是站在这里的。@ RICI:我认为任何类型的定义都是一个类型定义。可以是结构、数组、枚举等。在C中,头文件也是源文件,它当然只能包含类型定义。因此,如果您的意思可能是
,那么我的问题是
文件,而不是源文件。Elf库通常包含初始化器和终结器条目,即使它们不是ops。这些函数将具有条目。我不知道这些函数是必需的还是常规的,但我认为您会在gcc创建的任何共享对象中找到它们。Elf库通常包含初始化器和终结器条目,即使它们不是ops。这些函数将具有条目。我不知道这些函数是必需的还是常规的,但我认为您可以在gcc创建的任何共享对象中找到它们。