Mingw gcc, "-shared -static", проходящий вместе - PullRequest
1 голос
/ 18 марта 2019

При изучении make-файла Сцинтиллы для MinGW под Windows, я заметил, что он передает -shared и -static вместе как LDFLAGS в gcc .

LDFLAGS=-shared -static -mwindows $(LDMINGW)


Я погуглил и нашел только информацию из clang: https://reviews.llvm.org/D43811

[MinGW, CrossWindows] Разрешить передачу -static вместе с -shared
In these combinations, link a DLL as usual, but pass -Bstatic instead of -Bdynamic to indicate prefering static libraries.


Мой вопрос: Будет ли GCC делать то же самое?
Я пока не нашел никаких доказательств.

1 Ответ

1 голос
/ 18 марта 2019

Вы можете передать как -static, так и -shared в связи GCC. Их комбинированный эффект такой же, как вы описали в своей ссылке на llvm, и это всегда имело место для GCC.

-shared направляет связь GCC для создания общей библиотеки, а не программы, которого он достигает, передав опцию -shared своему вызову компоновщик.

-static направляет связь GCC, чтобы игнорировать общие библиотеки при разрешении параметры библиотеки ввода -lname. По умолчанию -lname будет разрешен поиск по указанным или по умолчанию каталогам поиска компоновщика для общая библиотека libname.so (в Windows [lib]name.dll) или статическая библиотека libname.a (в Windows также [lib]name.lib) и предпочесть общая библиотека, если они оба находятся в одном каталоге. -static просто исключает все общие библиотеки из поиска. GCC достигает этого, передавая опцию -Bstatic до его вызова компоновщика в позиции в сгенерированном компоновщике командная строка, которая предшествует всем опциям -lname.

Документация компоновщика GNU для -Bstatic является явной что этот параметр соответствует -shared и что результатом является создание общей библиотеки все зависимые библиотеки которых были статически разрешены.

-Bstatic

-dn

-non_shared

-static

Не создавать ссылки на общие библиотеки. Это имеет смысл только на платформах, для которых поддерживаются общие библиотеки. Различные варианты этой опции предназначены для совместимости с различными системами. Вы можете использовать эту опцию несколько раз в командной строке: это влияет на поиск в библиотеке параметров -l, которые следуют за ним. Эта опция также подразумевает --unresolved-symbols = report-all. Эта опция может использоваться с -shared. Это означает, что создается общая библиотека, но все внешние ссылки библиотеки должны быть разрешены путем извлечения записей из статических библиотек.

(акцент мой).

Хотя статическое связывание разделяемой библиотеки в принципе ограничено только связыванием так же, как статическая связь программы, на практике она часто встречается загвоздка в Unix и Linux, потому что весь объектный код связан с общей библиотекой ELF libname.so должно быть Независимый от позиции код , в соответствии с параметром компиляции GCC -fPIC, тогда как объектные файлы предназначены для архивированные в статических библиотеках обычно не компилируются с -fPIC. Использование связей -shared ... -static, таким образом, склонны к сбою, потому что необходимые статические библиотеки содержат объектные файлы не PIC.

Однако у вас нет этой проблемы с GCC в Windows, потому что нет такого различия, как PIC v. non-PIC в Windows PE код объекта.

...