Для чего используются файлы карт gcc-ссылок?

Каковы файлы ".map", созданные с помощью компоновщика gcc/g++ "-Map"? И как их читать?

Ответ 1

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

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

Файл карты - это MAP из ячейки памяти → расположение кода. Он дает имя функции по заданному адресу памяти. Из-за оптимизации это может быть не очень точно, но это дает вам возможность начать поиск ошибок, вызывающих сбои.

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

Ответ 2

Какие файлы ".map" генерируются с помощью опции gcc/g++ linker "-Map", используемой для?

Нет такой вещи, как "gcc linker" - GCC и компоновщик являются независимыми и отдельными проектами.

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

-M
   --print-map
       Print a link map to the standard output.
       A link map provides information about the link, including the following:
       ·   Where object files are mapped into memory.
       ·   How common symbols are allocated.
       ·   All archive members included in the link, with a mention of the symbol which caused the archive member to be brought in.
       ·   The values assigned to symbols.
       ...

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

Ответ 3

Компилятор gcc - это одна программа, которая генерирует файлы объектного кода, а компоновщик ld - вторая программа, объединяющая файлы объектного кода в исполняемый файл. Их можно объединить в одну командную строку.

Если вы генерируете программу для запуска на процессоре ARM, вам нужно использовать arm-none-eabi-gcc и arm-none-eabi-ld, чтобы код был правильным для архитектуры ARM. Gcc и ld сгенерируют код для вашего хост-компьютера.