Экранирование в файле спецификаций rpm

Я пытаюсь установить rpath в моем файле спецификаций с помощью оператора вроде

export LDFLAGS="-Wl-rpath=$ORIGIN/../lib"

Но я не могу правильно избежать "$ORIGIN". Мне нужно, чтобы команда gcc содержала строку «$ ORIGIN», а не расширяла ее где-либо по строке. Я попытался

\\\$ORIGIN
$$ORIGIN
\$\$ORIGIN
\\$\\$ORIGIN
\\\\\\$ORIGIN
\\\\\\\\$ORIGIN

и некоторые другие безуспешно. Какова правильная последовательность escape-символов?


person pythonic metaphor    schedule 10.07.2014    source источник
comment
Как вы определяете, что он работает неправильно? Чего именно вы ожидаете? Откуда вообще должно браться значение ORIGIN?   -  person Etan Reisner    schedule 10.07.2014
comment
@Etan в Linux, наличие $ORIGIN в вашем rpath имеет особое значение. Поэтому я не хочу расширять переменную ORIGIN, я хочу, чтобы rpath содержал буквальную строку $ORIGIN. Вы можете запустить chrpath в полученном исполняемом файле, чтобы увидеть, какой был установлен rpath, и ни один из них не установил правильную строку (хотя на самом деле я смотрю на команды сборки, когда они прокручиваются, и вижу, что это неправильно)   -  person pythonic metaphor    schedule 10.07.2014
comment
Хм. Раньше я не знал об этом. Это здорово. Я предполагаю, что все эти различные варианты закончились расширением переменной до пустой строки?   -  person Etan Reisner    schedule 10.07.2014
comment
Они делали разные вещи. Некоторые расширялись до RIGIN, некоторые расширялись до нуля, некоторые помещали туда числа. Последнее было для меня загадкой!   -  person pythonic metaphor    schedule 10.07.2014
comment
А, да, в какой-то момент это будет передано через make, поэтому оно должно пройти там невредимым. Я не думаю, что rpm на самом деле что-то с этим делает (хотя вы должны быть в состоянии проверить это с помощью скрипта, который rpm использует для сборки пакета, если вы его не очистите). Вы должны сначала заключить назначение в одну кавычку, чтобы оболочка не расширяла переменную для вас, тогда вам может понадобиться $$, чтобы правильно выйти из make, но я не уверен.   -  person Etan Reisner    schedule 10.07.2014
comment
Я должен заключить назначение в двойные кавычки, потому что в моем реальном rpm мне нужно расширение оболочки некоторых других частей LDFLAGS. Но, да, мне нужно обойти оболочку (почему я попытался избежать $) и сделать (почему я попытался использовать двойное $), и я не могу понять, как это сделать.   -  person pythonic metaphor    schedule 10.07.2014
comment
Вы можете чередовать цитаты для разных частей задания. Так что ="..."'$ORIGIN'"..." и это может помочь. Мне нужно подумать о частях, вовлеченных в это немного больше, хотя   -  person Etan Reisner    schedule 11.07.2014
comment
Спасибо, что задали этот вопрос. Я столкнулся с той же проблемой несколько недель назад, но в итоге решил ее, жестко закодировав полный RPATH (используя макрос specfile для получения правильного каталога lib), а не используя строку $ORIGIN. Это решение не будет работать для перемещаемых пакетов и некоторых других ситуаций.   -  person jayhendren    schedule 31.07.2014


Ответы (2)


Хорошо. Я провел небольшое тестирование и, полагаю, понял, что вам нужно сделать.

Попробуйте использовать один из следующих способов:

export LDFLAGS="-Wl,-rpath=\\$\$ORIGIN/../lib"

or

export LDFLAGS="-Wl,-rpath="'\$$ORIGIN'"/../lib"
person Etan Reisner    schedule 11.07.2014
comment
Я попробовал это и получил RIGIN вместо $ORIGIN - person pythonic metaphor; 14.07.2014
comment
@pythonicmetaphor Хм ... Как именно вы используете эту строку в своем файле спецификации и эту переменную в своем make-файле? - person Etan Reisner; 14.07.2014
comment
в разделе %build я устанавливаю некоторые переменные среды export VAR=blah; для нескольких вещей, а затем вызываю configure и make. Сценарий configure и результирующий make-файл являются стандартными средствами выпуска gnu; они используют LDFLAGS обычным способом. - person pythonic metaphor; 14.07.2014
comment
@pythonicmetaphor Вы можете попробовать "..."'\$$\$$ORIGIN'"...", но в основном это предположение. Мне нужно найти простой проект autotools, чтобы проверить, работает ли он, и у меня его нет навскидку. Версии в моем ответе работают с крошечным настраиваемым make-файлом, поэтому я немного запутался. - person Etan Reisner; 15.07.2014

Мне удалось разобраться в этом. Я использовал curl-7.19.7 для тестирования. В командной строке было достаточно следующего, чтобы make передал $ORIGIN компилятору:

export LDFLAGS='-Wl,-rpath=\$$ORIGIN/../lib'
./configure --prefix=/tmp/curl
make
make install

и я проверил с помощью readelf --dynamic /tmp/curl/bin/curl.

Однако из спецфайла мне нужно было еще раз экранировать обратную косую черту. Вот что у меня сработало из раздела %build specfile:

%define ldflags LDFLAGS='-Wl,-rpath=\\$$ORIGIN/../lib'
%configure --enable-shared %{ldflags}
make %{?_smp_mflags}

Для проверки вот вывод readelf:

[faceplant ~/rpmbuild/specs]% readelf --dynamic ../buildroot/sis-curl-7.19.7-2.el6.x86_64/usr/local/curl-7.19.7/bin/curl

Dynamic section at offset 0x1c028 contains 26 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib:/usr/local/curl-7.19.7/lib]
 0x000000000000000c (INIT)               0x401b98
 0x000000000000000d (FINI)               0x40b2f8
 0x000000006ffffef5 (GNU_HASH)           0x400260
 0x0000000000000005 (STRTAB)             0x400cb0
 0x0000000000000006 (SYMTAB)             0x4002c0
 0x000000000000000a (STRSZ)              1229 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x61c220
 0x0000000000000002 (PLTRELSZ)           2160 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x401328
 0x0000000000000007 (RELA)               0x4012c8
 0x0000000000000008 (RELASZ)             96 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x401258
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x40117e
 0x0000000000000000 (NULL)               0x0

Как видите, $ORIGIN/../lib попал в поле RPATH невредимым.

Надеюсь, это сработает для вас.

(P.S. не обращайте внимания на префиксы /usr/local/<package>-<version>. Это всего лишь метод упаковки, с которым я экспериментировал, чтобы удовлетворить некоторые потребности в упаковке для моей организации.)

person jayhendren    schedule 30.07.2014