У меня есть несколько вопросов:
a.out
замененный ELF
? Формат a.out
заставляет разделяемые библиотеки занимать фиксированное место в памяти. Если вы хотели распространять разделяемую библиотеку a.out, вам нужно было зарегистрировать ее адресное пространство. Это было хорошо для производительности, но совсем не масштабировалось. Убедитесь сами , насколько это было сложно (linuxjournal).
Напротив, в ELF разделяемые библиотеки могут быть загружены в любом месте памяти и даже могут отображаться по разным адресам для разных приложений, работающих на одном компьютере (при этом код по-прежнему эффективно загружается только в одном месте физической памяти). ! Для этого в архитектуре IA-32 необходимо пожертвовать регистром (% ebx). Более полная ссылка , показывающая, что разделяемые библиотеки стали более сложными в ELF, но это сложность на стороне компилятора, а не на стороне программиста.
Насколько я помню, одна из исходных проблем с форматом a.out заключалась в том, что он поддерживал только три раздела: текст, данные и bss. ELF допускает любое количество (или, по крайней мере, намного больше). Формат заголовка a.out был очень простым, что-то вроде:
word <magic>
word <text size>
word <data size>
word <bss size>
Формат ELF, напротив, имеет заголовки разделов с именами, размерами и т. Д.
Наличие большего количества разделов позволяет использовать стандартные разделы, но также дает нам const разделы, разделы конструктора и даже по одному разделу на функцию, если мы этого хотим.