Ответ 1
В зависимости от того, как кладется объектный код в памяти, могут быть значительные различия в скорости выполнения. В общем, вы хотите, чтобы горячие функции были близки друг к другу, поэтому они не смешиваются с холодными функциями, поэтому ваши Icache
и TLB
не загрязняются холодными функциями. Однако очень маловероятно, что вы пострадали от этого.
Скорее всего, у вас есть некоторые символы, которые разрешены одним способом в "быстром" исполняемом файле, а другой - в "медленном" исполняемом файле. Порядок архивных библиотек и объектных файлов в командной строке имеет значение, и вы можете в конечном итоге вытащить некоторый объект из ar1.a
в ссылку "fast", тогда как вы вытащите эквивалентный объект из ar2.a
в "медленную" ссылку. Возможно, есть некорректированный код в ar2.a
?
Запуск nm -A ar1.a ar2.a
и проверка, будут ли какие-либо символы, которые встречаются в обоих, будут первым шагом. Затем вы можете попросить компоновщика создать карту ссылок (с -Wl,-M,map.out
) и проверить, откуда эти символы на самом деле появляются в двух ссылках.