' __exidx_start' и '__exidx_end' что они делают?

Здравствуйте, у меня есть скрипт компоновщика, в котором я нашел этот код "__exidx_start = .;"который устанавливает значение метки на значение счетчика местоположений".Msgstr "Эта метка нигде не используется в одном и том же скрипте компоновщика.

Аналогичная метка определена на пару строк ниже первой, и она определена так же__exidx_end = .;".

Эти две метки являются границами .text а также .rodata разделы, но я не знаю, зачем кому-то определять эти два, если они не используются в скрипте компоновщика?

1 ответ

Эти символы используются внутри механизма раскрутки цепочки вызовов в GCC, который берет на себя управление на этапе обработки исключений. Например, в файле unwind-arm-common.inc:104 есть пример, где границы таблицы обработки исключений получаются как указатели на эти символы.

Что касается .ARM.exidx*-записи, которые заключают символы, они образуют индексную таблицу обработки исключений, которая является частью ABI обработки исключений ARM (в разделе 4.4.1) для C++.


Обновление 20.05.2020

Отвечая на вопрос @pixelou:
Эти разделы не связаны с отладкой, но составляют основу механизма раскрутки исключений. Снятие*.exidx* разделы вызывают неспособность очистить беспорядок заставляя программу abort(полностью сбой) вместо точной обработки недопустимых состояний в стеке. Без этой раскручивающей информации программа ведет себя так, как будто она построена с -fno-exceptionsвариант.

Они не используются в скрипте компоновщика, но они объявлены как внешние переменные и используются в библиотеке gcc. Уберите их, и вот что происходит:

... / gcc / config / arm / unwind-arm.c: 614: неопределенная ссылка на `__exidx_start'
.../gcc/config/arm/unwind-arm.c:614: неопределенная ссылка на `__exidx_end'
Другие вопросы по тегам