Модель линковщика: порядок статических библиотек
Условие
Смоделируйте, как GNU ld линкует объектные файлы и статические библиотеки (архивы) в порядке командной строки.
Каждый объектный файл определяет набор символов и ссылается на другие. Сначала линкуются все основные объектные файлы по порядку. Затем архивы по порядку. Внутри архива линковщик просматривает члены по порядку и включает член, если он определяет хотя бы один символ, который сейчас не определён, но на который уже есть ссылка. Просмотр архива повторяется, пока за проход включается хоть один новый член. К предыдущим архивам линковщик не возвращается.
Включая объект: все его символы становятся определёнными (если символ уже был определён, это повторное определение), его ссылки на ещё не определённые символы становятся неразрешёнными.
Ввод: n_main (1 ≤ n_main ≤ 50), затем строки объектов: имя d s₁ … s_d r t₁ … t_r (определения, затем ссылки). Затем число архивов a (0 ≤ a ≤ 20); каждый архив: строка имя k и k строк членов в том же формате (k ≤ 30).
Вывод: строка linked и имена включённых объектов в порядке включения. Затем, если были повторные определения, строка multiple definition: и такие символы по возрастанию; если остались неразрешённые ссылки, строка undefined reference: и символы по возрастанию; если ни того ни другого, строка OK.
Пример 1
Ввод:
1
main.o 1 main 1 area
1
libgeo.a 2
circle.o 1 area 1 pi
math.o 1 pi 0
Вывод:
linked main.o circle.o math.o
OK
Пример 2
Ввод:
1
main.o 1 main 1 b
2
liba.a 1
a.o 1 a 0
libb.a 1
b.o 1 b 1 a
Вывод:
linked main.o b.o
undefined reference: a
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.