nickita startcev (nicka_startcev) wrote,
nickita startcev
nicka_startcev

gcc и линковка

1 - Файлы вообще


1. есть список "объектников" и "библиотек"
2. есть список путей для поиска
3. имена библиотек достраивается до полного (-lm превращается в что-то типа libm.a)
4. файлы ищутся по путям для поиска, получается список файлов с путями
5. если какой-то из файлов не найден, ругаемся

2 - сама линковка вообще


1. у линковщика есть что-то типа волшебного имени которое должно попасть в готовый бинарник или имя объектника, который должен целиком попасть (навскидку, у гцц попадают все объектники)
2. из объектника наружу торчат зависимости, их надо удовлетворять
3. для удовлетворения зависимостей строится что-то типа списка тех объектников, которые попадут в бинарник. этот список не совпадает с списком файлов из первой части
4. если понадобилось имя, которого еще нет в уже имеющихся в списке бинарниках, то подбирается еще один бинарник, в котором оно есть. Неудовлетворенные зависимости из этого бинарника будут удовлетворяться рекурсивненько

3 - конфликты


1. объектники это одно, а библиотеки - чуть другое. между объектниками не может быть конфликтов вида "повторное определение символа", а между библиотеками может. При этом библиотеки менее приоритетны, то есть, если символ определен в нескольких местах, то возьмется из объектника.
2. weak. иногда нужно чтоб какой-то символ попал в выходной файл только в крайнем случае, тогда его метят как weak и он по возможности заменяется более другим
3. если символ определен в нескольких объектниках, то это ошибка, линковать такое нельзя
4. если символ определен и в объектнике и в любом количестве библиотек, то возьмется из объектника
5. если символ определен в нескольких библиотеках, то возьмется какой-то из них

4 - Неоднозначности


1. если из какого-то объектника нужен хоть один символ или он явно указан для линковки, то этот объектник целиком пойдет в дело
2. если для линковки указана библиотека, то из нее будут взяты только те объектники, в которых есть нужные нам символы, остальные объектники будут проигнорированы
3. weak - это еще не нужда.
4. если какой-то объектник указан явно и в нем есть замена для weak, то замена произойдет
5. если в каком-то объектнике в либе есть замена для weak, но нет явно нужных символов, то замена НЕ произойдет и будут грабли
6. обычно символы ищутся в порядке слева направо в порядке аргументов линкеру и будет взят первый, самый левый (интересно, что на это скажут евреи и арабы)
7. порядок поиска внутри либы неизвестен

5 - итого


1. после того, как все нужные объектники собраны в кучу и к ним добавлены объектники из библиотек, начинается собственно линковка, когда увязываются экспорты с импортами.
2. При этом импорт берется первый из найденных.
3. Если найдены замены для weak - то они заменяются. Если не найдены - то всё равно всё ок
Subscribe

  • псевдоочепятка

    "проект, созданный чтоб популизировать "

  • цитата

    «Никогда еще перед Конгрессом Соединенных Штатов, собравшимся рассмотреть положение дел в стране, не открывалась такая приятная картина, как сегодня.…

  • про Росатый, цитата

    я бы (в идеале) хотел читать примерно такое от пресслужбы росатома: «Мы ввезли 100500 тонн шмоксо-фторо-урано-штуки, из этого мы на заводе получим…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments