Вопрос:

Libtool удаляет все параметры с -M?

c++ solaris autotools libtool map-files

191 просмотра

1 ответ

1 Репутация автора

Я пытаюсь отследить сбой связи с файлом-файлом в Solaris. Отсутствующий файл карты вызывает следующую ошибку, когда я пытаюсь запустить наши собственные тесты:

$ ./cryptestcwd v
ld.so.1: cryptestcwd: fatal:
/export/home/cryptopp/.libs/libcryptopp.so.6: hardware capability
(CA_SUNW_HW_1) unsupported: 0x4800000  [ AES SSE4.1 ]
Killed

Я дошел до этого правила Automake. libcryptopp_la_LINK, который я считаю общим объектом, отсутствует AM_LDFLAGS. AM_LDFLAGSдержит -M cryptopp.mapfileопцию.

libcryptopp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
    $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
    $(CXXFLAGS) $(libcryptopp_la_LDFLAGS) $(LDFLAGS) -o $@

Я попытался исправить это sedпосле configureзапуска:

libcryptopp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
    $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
    $(CXXFLAGS) $(libcryptopp_la_LDFLAGS) -M cryptopp.mapfile $(LDFLAGS) -o $@

Я подтвердил, что sedуспешно, но тот же тест снова не проходит. При вызове команд -M <mapfile>отсутствует.

В руководстве по libtool говорится об -Mаргументах в Cygwin, но не в Solaris (и обсуждение относится только к GCC, а не к другим компиляторам, таким как IBM XL C / C ++, Sun C / C ++ и LLVM Clang):

Обратите внимание, что вам также необходимо убедиться, что стандартные каталоги Unix (например, / bin, / lib, / usr, / etc) находятся в корне диска. Это означает, что вы должны установить сам Cygwin в корневой каталог C: / (или D: /, или E: / и т. Д.) - вместо рекомендуемой установки в C: / cygwin /. Кроме того, все имена файлов, используемые в системе сборки, должны быть относительными, символические ссылки не должны использоваться в деревьях каталогов источника или сборки, и следует избегать всех опций -M * для gcc, кроме -MMD.

Других упоминаний нет -M.

И нет никакой диагностики, такой как «Удаление -M <mapfile>опций в компоновщик Sun» или «Предупреждение: libtoolопция не понимает -M <mapfile>» .

У меня вопрос, libtoolотказывается ли -Mи его аргументы по какой-то причине?

Автор: jww Источник Размещён: 08.11.2017 11:44

Ответы (1)


1 плюс

96969 Репутация автора

Решение

Libtool пропускает некоторые параметры ссылок при создании библиотеки. Руководство объясняет :

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

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

Эксперименты показывают, что -Mэто действительно один из вариантов, которые libtoolлишают. В частности, если указать , LDFLAGSсодержащий -Mпараметр в makeкомандной строке , то я могу наблюдать его отражение в makeвыходе , когда он запускает libtoolссылку, но не в libtool«s собственного эха команды линии связи , который фактически выполняется:

$ make LDFLAGS = "- M mapfile"

/ bin / sh ./libtool --tag = CC --mode = ссылка gcc -g -O2 -M mapfile -o libmylib.la -rpath / usr / local / lib x.lo y.lo

libtool: ссылка: gcc -shared -fPIC -DPIC .libs / xo .libs / yo -O2 -Wl, -soname -Wl, libmylib.so.0 -o .libs / libmylib.so.0.0.0

В libtoolДокументах предлагают два обходные пути , чтобы передать параметры линии связи , которые в противном случае были бы отделенные:

  • Для добросовестных опции компоновщика, вы можете использовать один или более -Wl,или -Xlinkerварианты , чтобы пройти через ваши варианты libtoolи водитель линкера к самому линкера. Например,

    LDFLAGS=-Wl,-M,cryptopp.mapfile
    
  • Для параметров, предназначенных специально для драйвера компоновщика , в документах предлагается добавить флаги в команду драйвера компилятора (CC = "gcc -M mapfile"), но это неэффективно, поскольку $(CC)переменная раскрывается makeдля формирования libtoolкомандной строки, оставляя любые параметры Выраженный в нем подвержен libtoolзачистке.

Кроме того, однако, есть

  • -XCClinkerВариант , по которому параметры могут быть переданы через драйвер линкера (в отличии от самого линкера), но его поведение кажется немного изворотливым: кажется , игнорировать варианты , которые не начинаются с дефисом (например, именем вашего файл карты).
Автор: John Bollinger Размещён: 09.11.2017 06:25
Вопросы из категории :
32x32