Инкрементальное редактирование связей
Как уже отмечалось ранее, результат работы ld(1) можно исполь- зовать в качестве исходной информации для последующего редактирования связей, при условии, что сохраняется информация о настройке ссылок (то есть задана опция -r). Редактирование связей, использующее ранее полученную информацию, называется инкрементальным. Есть смысл разделять большие системы на несколько подсистем, связи внутри которых редактируются независимо, а затем, при необходимости, осуществлять пересборку системы в целом, например:
Шаг 1:
ld -r -o outfile1 ifile1 infile1.o
/* ifile1 */ SECTIONS { ss1: { f1.o f2.o . . . fn.o } }
Шаг 2:
ld -r -o outfile2 ifile2 infile2.o
/* ifile2 */ SECTIONS { ss2: { g1.o g2.o . . . gn.o } }
Шаг 3:
ld -a -o final.out outfile1 outfile2
Если подсистемы формируются разумно, то после перекомпиляции нескольких файлов придется повторить лишь часть процесса редактирования связей. Рекомендуется придерживаться двух простых правил:
- Промежуточные вызовы редактора связей должны (посредством предложений SECTIONS) управлять только построением выходных секций из входных файлов и их секций, но не назначать адреса этим секциям.
- Все операторы присваивания, а равно и предложения, управляющие размещением секций и конфигурацией памяти, следует включать только в окончательный вызов ld(1).