Q1: Да, если вы скомпилируете main1.c
в своем вопросе, он создаст без необходимости связывать что-либо, потому что он не использует функции, которые определены в другом месте.
Q2: Эта диаграмма неприменима к зданию main1.c
, поскольку main1.c
не использует внешние функции.Но в программе, которая имеет вызов, скажем, printf()
, вот что происходит: диаграмма показывает, что записи о перемещении о libc.so
размещаются в main2.o
.Вы спрашиваете, "почему в libc.so все еще есть записи о перемещении?"но записи о перемещении не помещаются в libc.so
;они помещаются в main2.o
, и они относятся к вещам в libc.so
.
Q2, продолжение # 1: Когда вы говорите "за libc"так что все известно ", это верно только в пределах libc.so
.Все, что использует функцию, определенную в libc.so
, будет не знать, как определена эта функция, , пока не произойдет связывание .Это функция ld
: скопировать справочную информацию из библиотеки типа libc.so
в программу , которая создается , например main2
на диаграмме.Справочная информация позволяет ядру, выполняющему от main2
до , также загружать libc.so
в память таким образом, что выполнение может перетекать из кода main2
в код libc.so
и обратно в main2
везде, где main2
вызывает функцию, определение / код которой находится в libc.so
.
Q3: Я думаю, что лучший способ выразить это так: информация, которая используется для заполнить структура перемещения в пределах main2.o
происходит от libc.so
.Когда я говорю, что записи о перемещении копируются из libc.so
, я имею в виду следующее: информация о цели (например, printf()
) берется из libc.so
и используется для предоставления значений для записи о перемещении в main2.o
, целью которой являетсясообщить загрузчику, откуда загружать код для printf()
.
Q3, продолжение # 1: Есть еще один смысл, в котором libc.so
имеет записи о перемещении:встроенный libc.so
добавил записи перемещения в libc.so
, так что все, что хочет использовать его (экспортируемые) функции и переменные, могут это делать. Эти не нужно никуда копировать.Частью построения объектного файла является создание информации для внутренних вещей, которые могут использовать другие программы;и частью построения программы является заполнение информацией о внешних вещах, которые она использует.Но мне кажется, что диаграмма показывает, что информация о libc.so
и libvector.so
добавляется в main2.o
, так что загрузчик может загрузить весь необходимый код в память, когда main2
выполняется.