2014-11-04 2 views
0

Поскольку объектный файл (ET_REL, * .o) должен иметь разделы, а динамические библиотеки (ET_DYN, * .so) имеют как сегменты, так и разделы, могут ли файлы * so быть связаны статически, даже если они предназначены для динамической компоновки?Мог ли файл .so быть связанным с исполняемым файлом статически?

ответ

1

динамические библиотеки (ET_DYN, * .so) имеют оба сегмента и секции

Динамические библиотеки обычно имеют разделы, но только потому, что они не были лишены. Существует множество динамических библиотек, которые делают не имеют любые разделы (только для сегментов требуется для работы библиотеки).

может ли * файлы связываться статически, даже если он предназначен для динамической компоновки?

No. Большинство UNIX линкеры считают a.out и foo.so быть окончательные ссылка продукты, без предоставления каких-либо дальнейших изменений.

Включая foo.so в a.out теоретически возможно, но довольно сложно на практике.

Рассмотрим случай, когда foo.so определяет и экспортирует функции foo и bar, и что foo звонки bar. Предположим, что можно было связать foo.so с a.out, у которого было другое определение bar.

Что должно произойти в этом случае? Ошибка множественного определения? foo позвонить bar внутри foo.so? foo позвонить bar внутри a.out? Что-то другое? Все перечисленные выше альтернативы потребуют, чтобы линкер стал намного сложнее, чем сейчас, и уже достаточно сложно.

Смежные вопросы