Ld warning: слишком много индивидуальных процедур для компактного разматывания для кодирования

У компоновщика для цели симулятора iOS я сообщаю следующее предупреждение:

ld: warning: too many personality routines for compact unwind to encode

Никакой номер строки не указан, ни что-либо еще, что может быть выполнено. Googling появился в некотором Apple с открытым исходным кодом, но я не понимаю его.

Что это значит и что я могу сделать для его решения?

Ответы

Ответ 1

Я нашел некоторую информацию в С++ ABI для документации Itanium, которая проливает свет на то, что это значит.

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

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

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

Ответ 2

Если у вас есть сбой при исключении с этим предупреждением, т.е. ::terminate() вызывает каждый throw, обходным путем является использование таблиц обработки исключений старого карлика. Добавьте следующие флаги в Настройки сборки/Связывание/Другие флаги компоновщика:

-Wl,-keep_dwarf_unwind -Wl,-no_compact_unwind

Ответ 3

Вы можете отключить предупреждение с помощью -Wl,-no_compact_unwind для других флагов компоновщика. Я считаю это безобидным.

Ответ 4

Я столкнулся с этой проблемой и при попытке запустить на симуляторе iOS, пока мой код работал правильно на устройстве. В моем случае это было не предупреждение, а ошибка компоновщика.

К счастью, я вспомнил, что я добавил два флага для luajit для правильной работы в соответствии с инструкциями этой страницы в разделе раздел Вложение LuaJIT:

-pagezero_size 10000 -image_base 100000000

Я предполагаю, что адрес image_base просто выходит за пределы центрального процессора.

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

Итак, перейдите к настройкам вашего проекта и найдите любые жесткие проводные значения такого типа, если они не совпадают.

Надеюсь, что это поможет,

M