Каждый ли файл.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 в дикой природе. Мне все еще любопытно, возможно ли это в теории, но я нашел ответ на практическую сторону моего вопроса, поэтому я подумал, что это может помочь другим, кто интересуется тем же!