Что означает раздел (i.function name) в ARM CC (C ++)? - PullRequest
2 голосов
/ 06 мая 2020

Я обнаружил раздел (i.function name) в файле карты после завершения сборки.

======================== ==============================

пример)

[foo1.h] / / inline определение и объявление функции

__ forceinline UINT32 func1 (VOID) {...}

[foo2.cpp] // используемая встроенная функция

# include "foo1. h "

UINT32 func2 (VOID) {... func1 (); // Не встроено во время компиляции}

[Файл карты]

foo2.o (.text) относится к foo2.o (i.func1) для func1

================================================== ====

Типичный раздел в файле карты выглядит следующим образом: (.text), (.ARM.exidx), (.data), (.constdata), (.bss), (USER Defined Имя раздела), ...

После нескольких тестов сборки, я думаю, появляется раздел (i.function name), когда функция, которая определяет встроенную, но компилятор не применяет встроенную, создает символ AREA в объектном файле, чтобы сделать вывод линейной версии. И такая функция находится в разделе (i.function name). Если все встроенные функции являются встроенными, отсутствует раздел символов или (i.function name).

Почему встроенная функция, которая не является встроенной, применяется в этом разделе? (Не .text?)

Каково точное значение раздела (i.function name)?

Я просмотрел следующие документы, но не смог получить нужный мне ответ по поводу содержимого.

  • Руководство пользователя компилятора ARM, Справочное руководство по компилятору ARM, Руководство пользователя ARM Link, ARM CC Руководство пользователя, ELF для архитектуры ARM

1 Ответ

0 голосов
/ 12 мая 2020

Компилятор будет генерировать по одному разделу для каждой функции, когда включен флаг --split_sections ( см. Здесь ), являющийся назначенным именем раздела i.functionName.

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

С другой стороны, inline будет (из wikipedia ):

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

Таким образом, оба вместе без какого-либо контроля ( или ограничения друг друга) могут закончиться вызовом неправильного сегмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...