Каждый ли файл.so имеет PLT/GOT?

Некоторое время я думал об этом, потому что заметил, что даже в действительно фундаментальных библиотеках, таких как libc, есть GOT/PLT, состоящий из важных функций, таких как malloc() и его друзья.

Можно ли вообще создать общую библиотеку, в которой нет GOT/PLT? Будет ли такая библиотека когда-нибудь возникать в дикой природе, вне академических занятий? (Если это поможет, рассмотрим исключительно платформу x86)

Моя интуиция говорит мне, что ответы на эти вопросы - "нет" и "да" соответственно, но я не уверен на 100% ни в одном.

Возможно ли, что файл.so, который просто содержит список типов C, не будет иметь GOT/PLT? Возможно, но я не могу понять, почему это происходит на практике, когда вы можете просто #include.h файл, чтобы сделать это!

1 ответ

Я нашел ответ на вторую часть вопроса, и мне кажется, что нет. В моем каталоге / lib есть чуть менее 5500 .so файлов, и я запустил следующий скрипт оболочки, который называется 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 файлами.

Таким образом, на практике не похоже, что вы когда-нибудь встретите файл.so без PLT/GOT в дикой природе. Мне все еще любопытно, возможно ли это в теории, но я нашел ответ на практическую сторону моего вопроса, поэтому я подумал, что это может помочь другим, кто интересуется тем же!

Другие вопросы по тегам