Почему gcc хочет, чтобы я ссылался на libgcc_ext.10.5.dylib?

0

Я построил GCC 4.9.2 в Mac OS X из исходного статически (используя --disable-shared), только для языка C (не C++), со статической версией libgcc (libgcc.a). Конечно, поскольку я только создал статическую версию libgcc, нет такой вещи, как libgcc *.dylib. GCC построил и установил libgcc.a (как и ожидалось), и все это прекрасно. Теперь, когда я вызываю эту недавно созданную копию GCC, используя следующую команду (используя простой привет, мир! Пример):

gcc -v test.c -o test

он показывает эти флаги компилятора по умолчанию:

-no_compact_unwind -lSystem -lgcc_ext.10.5 -lgcc -lSystem

Нет нет нет! Я не хочу, чтобы вы пытались установить ссылку на общую версию libgcc! Разве вы не помните, я сказал вам, что на этапе настройки? И если я использую параметр -static-libgcc, я получаю следующее:

-no_compact_unwind -lgcc_eh -lgcc -lSystem

libgcc_eh? А? Когда это было построено во время компиляции GCC? О, верно, не было, поэтому почему он не может найти libgcc_eh.a.

Что здесь происходит? Я специально сказал GCC, что мне не нужны общие библиотеки, так почему он пытается связать их по умолчанию? Я могу, конечно, исправить все это, используя -nodefaultlibs и указав -lgcc и -lSystem вручную, но зачем мне это делать?

Кроме того, в документации GCC есть следующее:

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

Поэтому, исходя из этого, я полагаю, что если бы я специально не просил GCC создать общую версию libgcc, он не должен был предполагать, что я хотел бы ссылаться на что-либо, кроме статической версии. Но по какой-то причине это все равно. Мне не удалось найти параметр configure, который бы предотвратил это, а также параметр, который позволяет мне указать, к каким "умолчанию libs" привязаны по умолчанию. Кажется, GCC заставляет меня ссылаться на общую версию libgcc, которой нет, если я не подавил это с помощью -nodefaultlibs. Это кажется обратным.

  • 0
    Почему отрицательный голос?
Теги:
macos
gcc

1 ответ

0
Лучший ответ

Я понял, как это исправить. Мне пришлось отредактировать /gcc/config/darwin.h в источнике GCC и прокомментировать, где определен макрос REAL_LIBGCC_SPEC. Если оставить этот макрос неопределенным, он гарантирует, что GCC будет передавать флаги библиотеки -lgcc и -lSystem во время связывания, что я и хотел.

Документы GCC для драйвера компиляции объясняют, что делает этот и другие макросы:

https://gcc.gnu.org/onlinedocs/gccint/Driver.html

- Макро: LIBGCC_SPEC Другая константа строки C, которая сообщает программе драйвера GCC, как и когда помещать ссылку на libgcc.a в командную строку компоновщика. Эта константа помещается как до, так и после значения LIB_SPEC. Если этот макрос не определен, драйвер GCC предоставляет значение по умолчанию, которое передает строку -lgcc в компоновщик.

- Макро: REAL_LIBGCC_SPEC По умолчанию, если ENABLE_SHARED_LIBGCC определен, LIBGCC_SPEC напрямую не используется программой драйвера, а вместо этого изменен для ссылки на разные версии libgcc.a в зависимости от значений флагов командной строки -static, [CN04 ], -static -libgcc и -shared -libgcc. В отношении целей, где эти изменения не подходят, вместо этого определите REAL_LIBGCC_SPEC. REAL_LIBGCC_SPEC сообщает драйверу, как разместить ссылку на libgcc в командной строке ссылки, но, в отличие от LIBGCC_SPEC, он используется без изменений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню