Умное использование линкерных скриптов? - PullRequest
2 голосов
/ 12 ноября 2010

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

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

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

1 Ответ

3 голосов
/ 12 ноября 2010

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

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

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

...