Предположительно, чтобы гарантировать сложность лайнера, в коде используется таблица переходов, состоящая из меток, используемых в качестве значений.
Labels-as-values - это расширение GNU C, которое позволяетВы должны использовать &&
, чтобы взять адрес этикетки.Адрес набирается void *
, и затем вы можете использовать goto *address;
для перехода к нему.
Небольшой поворот с базовой меткой заключается в том, что вместо сохранения абсолютных меток в таблице, код сохраняет смещения изdo_uknown_form
label.
Это экономит место (смещение может быть 4-байтовым int вместо 8-байтового указателя) в таблице и помогает генерировать лучший код для общих библиотек (отсюда #ifdef SHARED
) какдаже таблица абсолютных меток static const
должна быть исправлена, когда код загружен в перемещаемую разделяемую библиотеку, но смещения остаются такими же, поэтому необходимость исправления исчезает, и таблица может быть сохранена в постоянной памяти,
Методика описана в эссе Ульриха Дреппера Как писать общие библиотеки .