' __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'