я прочитал в this SO ответить на этот вопросСтатически связанные библиотеки: как узнать, находится ли код в смежной области в исполняемом файле?
Когда вы статически файл в исполняемый файл, содержимое этого файла включаются во время компоновки. Другими словами, содержимое файла физически вставляется в исполняемый файл, который вы будете запускать.
Мне было интересно, если в общем случае этот код находится в смежной области. Я узнал от another SO ответить, что это может быть не всегда так:
Это предположение, вероятно, справедливо в простых случаях, но никоим образом не гарантировано.
Скажем, у меня есть разделенный двоичный код и нет исходного кода. Тем не менее, я знаю, что исполняемый файл был создан с использованием определенной статически связанной библиотеки.
- Можно ли узнать, находится ли код из статически связанной библиотеки в смежной области в исполняемом файле? Если это невозможно в общем случае, существуют ли какие-либо эвристики или индикаторы?
- Зачем компоновщику помещать код библиотеки в разных местах исполняемого файла? Думаю, это были бы редкие случаи, верно?
Вторая ссылка в вашем вопросе, кажется, отвечает на второй вопрос (почему линкер переупорядочивает код?). В общем, он будет делать это для эффективности, если вы попросите его; как правило, вам необходимо предоставить профилирующую информацию для компоновщика, чтобы иметь возможность выполнить эту оптимизацию. См. Документацию 'gcc' для' -freorder-functions' – rici