Скрипты компоновщика: стратегии отладки?

Я пытаюсь отладить возникшую у меня проблему компоновщика при написании ядра.

Проблема в том, что у меня есть переменная SCAN_CODE_MAPPING, которую я не могу использовать - она ​​кажется пустой или что-то в этом роде. Я могу исправить это, изменив способ связывания программы, но не знаю почему.

Когда я заглядываю внутрь сгенерированного двоичного файла с помощью objdump, данные для переменной определенно там, так что что-то сломано со ссылкой на нее.

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

Что меня смущает, так это то, что в обеих таблицах символов есть все одинаковые символы, все они одинаковой длины и, похоже, содержат правильные данные. Единственное различие, которое я вижу, это то, что они находятся в разном порядке.

Пока я пробовал

  • проверка SCAN_CODE_MAPPING области памяти, чтобы убедиться, что в ней есть данные, которые я ожидаю, и что они не были обнулены
  • проверка того, что все символы совпадают
  • проверка того, что все содержимое символа имеет одинаковую длину
  • глядя на .data.rel.ro.local, чтобы убедиться, что в нем есть адрес данных

Одна из возможных подсказок - это предупреждение:

warning: uninitialized space declared in non-BSS section `.text': zeroing

которые я получаю как в сломанном, так и в правильном корпусе.

Что мне попробовать дальше?


person jvns    schedule 11.12.2013    source источник
comment
Голосование за закрытие в качестве помощи при отладке.   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 07.10.2015


Ответы (2)


Вы можете получить массу дополнительной информации, используя "readelf".

В частности, обратите внимание на заголовки программ:

программа readelf -l

Ваш раздел BSS сильно отличается от стандартного, что, вероятно, вызывает предупреждение. Вот как по умолчанию выглядит моя система:

  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 64 / 8 : 1);
  }

Если раздел ввода не соответствует чему-либо в вашем скрипте компоновщика, компоновщик все равно должен где-то его разместить. Убедитесь, что вы охватываете все разделы ввода.

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

Раздел родата обычно идет после раздела текста. Оба они доступны только для чтения во время выполнения и будут отображаться в заголовках ваших программ как запись ЗАГРУЗИТЬ с разрешениями на чтение и выполнение. Эта запись LOAD является текстовым сегментом.

Раздел bss обычно идет после раздела данных. Оба они доступны для записи во время выполнения и будут отображаться один раз в заголовках вашей программы как запись LOAD с разрешениями на чтение и запись. Эта запись LOAD является сегментом данных.

Если вы измените порядок, это повлияет на то, как компоновщик генерирует заголовки программы. Заголовки программы, а не заголовки разделов, используются при загрузке вашей программы перед ее выполнением. Обязательно проверяйте заголовки программы при использовании настраиваемого скрипта компоновщика.

Если вы можете более подробно описать ваши настоящие симптомы, вам будет легче помочь.

person mspang    schedule 23.12.2013
comment
Это не было моей проблемой (я писал ядро, поэтому структура конечного исполняемого файла не имела большого значения). Но в любом случае полезная информация. - person jvns; 23.12.2013

Проблема здесь оказалась в том, что я писал ОС, и загружалось только 12 КБ вместо всего этого. Таким образом, сценарий компоновщика действительно работал нормально.

Основными инструментами, которые я использовал для понимания двоичных файлов, были:

  • nm
  • objdump
  • Readelf
person jvns    schedule 23.12.2013