2010-11-12 3 views
1

Замечательный комментарий к my answer describing how to use linker scripts to make a ctor-like function list отметил, что недавний GNU ld имеет значительно улучшенную поддержку для прививки новых разделов в сценарии системного компоновщика с -Wl,-T... и INSERT BEFORE/INSERT AFTER. Это заставило меня задуматься о других трюках сценария компоновщика.Умное использование сценариев компоновщика?

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

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

ответ

2

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

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

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