Умное использование скриптов компоновщика?

Отличный комментарий к в моем ответе, описывающем, как использовать скрипты компоновщика для создания списка функций, подобного ctor, указано, что недавняя GNU ld значительно улучшила поддержку добавления новых разделов в системные скрипты компоновщика с помощью -Wl,-T... и INSERT BEFORE/INSERT AFTER. Это заставило меня задуматься о других трюках со сценариями компоновщика.

Для прошивки сетевой карты я модифицировал скрипт компоновщика, чтобы сгруппировать рабочие модули прошивки, чтобы все они находились в непрерывном блоке, который мог бы находиться в кэше L1 без конфликтов. Чтобы избавиться от отставших (где я не мог сгруппировать по .o), я использовал атрибуты раздела для отдельных функций. Счетчики производительности подтвердили, что это действительно работает (уменьшенный кэш инструкций L1 почти до нуля).

Какие еще умные вещи вы сделали с помощью скриптов компоновщика?


person Ben Jackson    schedule 12.11.2010    source источник


Ответы (1)


На определенной платформе, по причинам, в которые я не буду вдаваться, мне нужно было иметь раздел исполняемого файла, который я мог отбросить после загрузки. Теперь, к сожалению, отменить отображение памяти для исполняемого файла было невозможно, поэтому я был вынужден прибегнуть к хитрости компоновщика.

В итоге я представил часть исполняемого файла, которая использовала псевдоним bss. Таким образом, предполагая, что я смогу ввести некоторый код достаточно рано, я смогу скопировать данные, повторно инициализировать bss, и, пока моя секция с псевдонимом будет меньше, чем общая bss исполняемого файла, я не буду платить за эту привилегию. Есть пара проблем в том, что я вообще не мог изменить crt, и самый ранний момент, когда я мог ввести код, был еще после инициализации tls (которая использовала немного bss), но ничего невозможного не было.

Я еще как-то удивлен, что это заработало, я бы подумал, что бсс инициализировался крт после загрузки всех разделов программы. Я не пробовал это ни на одной платформе, где у меня есть доступ к загрузчику или источнику crt.

person Joe Valenzuela    schedule 12.11.2010