Не могу заставить GCC -static-libgcc работать с библиотеками DYLIB в Mac OS X - PullRequest
2 голосов
/ 29 марта 2012

Я установил GCC 4.6.3 в несистемный путь в системе Mac, и он работает нормально. Однако GCC хочет использовать код из libgcc для всех двоичных файлов, которые я компилирую, и запуск otool -L показывает, что эти скомпилированные программы ищут libgcc_s.1.dylib в пути установки GCC. Я могу переопределить это, передав -static-libgcc, который просто компилирует необходимые данные в двоичный файл, и это нормально. Проблема в том, что это работает только с исполняемыми файлами, а не с общими библиотеками. Если я использую GCC для компиляции какой-либо сторонней библиотеки, которую я хочу использовать в одной из моих программ в качестве .dylib, эти библиотеки по-прежнему ищут libgcc_s.1.dylib в локальном пути установки GCC , даже если я указываю -static -libgcc! Нет необходимости говорить, что это проблема, поскольку нет гарантии, что эти библиотеки найдут libgcc при запуске в другой системе.

Я пробовал это с ffmpeg. Если я посмотрю на config.log, -static-libgcc наверняка используется. GCC просто не связывает libgcc статически с полученными dylibs. Я даже попробовал опции -nostdlib, -nostartfiles и -nodefaultlibs, но они были проигнорированы. Я снова проверил config.log, и они определенно есть!

1 Ответ

2 голосов
/ 29 марта 2012

Я считаю, что это связано с выбросом исключений через границу разделяемой библиотеки.Эта страница говорит:

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

Поэтому драйверы G ++ и GCJ автоматически добавляют -shared-libgcc всякий раз, когда вы создаете разделяемую библиотеку или основной исполняемый файл,потому что программы на C ++ и Java обычно используют исключения, так что это правильное решение.

Остальные части этого раздела дают возможный обходной путь (кажется), и это заключается в использовании драйвера GCC для связивашей общей библиотеки, однако, если статически связанная библиотека выдает исключения, вы , вероятно, получите нарушение сегментации.

...