Как я могу заставить LD ставить всегда ставить точку входа в расположение -Ttext? - PullRequest
1 голос
/ 19 марта 2019

Я пишу свою собственную операционную систему (статические адреса), и я изо всех сил стараюсь, чтобы компоновщик всегда помещал мою _start функцию в желаемое место внутри процессов.Я указываю местоположение с -Ttext 0x10000 в моем файле сборки (скажем, 0x10000 для этого примера).

Обычно это работает , но когда я использую -O2, компоновщик вместо этого помещает мою функцию main на этот адрес.

Так, как я могу убедиться, что это _start, который заканчивается на этом адресе?И возможно ли это без написания сценариев компоновщика?

Функция _start является общей для всех процессов и должна обеспечивать хороший выход для планировщика в случаях, когда программа возвращается вместо вызова exit().В моей голове есть обходное решение, но я бы предпочел, чтобы это работало с компоновщиком.

1 Ответ

1 голос
/ 20 марта 2019

Итак, я нашел 2 решения.

  1. Установить .section .text.startup в файле, содержащем _start
  2. Установить .section .text.mustbefirst (мое собственное имя раздела) в файле, содержащем _start

В первом варианте я просто проверяю, что стартовый код также включен в том же порядке, что и код, содержащий main, хотя есть некоторая двусмысленность, которая сработала в моем случае.

Во втором варианте я изменил скрипт компоновщика по умолчанию, чтобы убедиться, что мой символ секции был первым.

Если первое надежно (например, зависит от порядка аргументов или чего-то еще), то это нормально. Как в сторону; кто-нибудь знает? Если нет, то я бы порекомендовал новый символ раздела и измененный скрипт компоновщика.

...