[devel] [PATCH] verify-elf: honor RUNPATH, too ; was: Re: Проблема при сборке newmon 27.0

Ivan Zakharyaschev imz на altlinux.org
Вс Ноя 27 14:12:40 MSK 2016


On Sun, 27 Nov 2016, Ivan Zakharyaschev wrote:

>>  On Tue, 15 Nov 2016, Hihin Ruslan wrote:
>> 
>> >   Здравствуйте Alexey Tourbin
>> >    В сообщении от 13 ноября 2016 Alexey Tourbin написал(a):
>> > >   2016-11-13 11:23 GMT+03:00 Hihin Ruslan <ruslandh на gmail.com>:
>> > > >   Ruslan Hihin, [13.11.16 11:18]
>> > > >   Я что-то не пойму как правильно сделать. В новой версии
>> > > >   palemoon почему-то вдруг взорвалось :
>> > > > 
>> > > >   ...
>> > > >   Verifying ELF objects in /usr/src/tmp/palemoon-buildroot
>> > > >   (arch=normal,fhs=normal,lfs=relaxed,lint=relaxed,rpath=norma
>> > > >  l,stack=normal,textrel=normal,unresolved=normal) verify-elf:
>> > > >   ERROR: ./usr/lib64/newmoon/plugin-container: not found:
>> > > >   libmozalloc.so
>> > > >   verify-elf: ERROR: ./usr/lib64/newmoon/plugin-container: not
>> > > >   found: libxul.so
>> > > 
>> > >   У него в прежней версии прописан RPATH, а в новой, вероятно,
>> > >   не прописан (или прописан неверно).
>> > > 
>> > >   $ rpmpeek newmoon-26.5.0-alt1.x86_64.rpm \
>> > >   objdump -p ./usr/lib64/newmoon/plugin-container |grep PATH
>> > >     RPATH                /usr/lib64/newmoon
>> > > 
>> > >   plugin-container как программу и запустить не получится, если
>> > >   только какой-нибудь скрипт перед запуском не выставит ему в
>> > >   окружение LD_LIBRARY_PATH=/usr/lib64/newmoon.
>> > > 
>> > >   Короче, посмотрите, что говорит
>> > >   $ objdump -p
>> > >   newmoon-buildroot/usr/lib64/newmoon/plugin-container |grep
>> > >   PATH
>> > 
>> >   Получается что-то странное:
>> >   objdump -p plugin-container  | grep PATH
>> >    RUNPATH              /usr/lib64/newmoon
>> > 
>> >   Что за RUNPATH ?
>>
>>  Из того, что я узнал и понял из этого обсуждения, RUNPATH должен был бы
>>  работать не хуже, чем RPATH, который был в прошлых версиях.
>>
>>  Но хочется понять до конца: проблема всё же в изменении этого ключевого
>>  слова (как Вы стали предполагать) или в каких-то других изменениях.
>
> Вот действительно, проблема в том, что verify-elf не учитывает RUNPATH (как 
> Вы и предположили). В отличие от lib.req, например.

Предлагаю патч для rpm. (Руслан, можете попробовать собрать, добавив в 
началао заданиясборку того же тега rpm, что в задании 173509.)

Subject: [PATCH] verify-elf: honor RUNPATH, too (like in lib.req.in:95 and debuginfo.req.in:76)

in addition to RPATH
---
  scripts/verify-elf.in | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/verify-elf.in b/scripts/verify-elf.in
index 316117f..6c30448 100755
--- a/scripts/verify-elf.in
+++ b/scripts/verify-elf.in
@@ -362,7 +362,7 @@ VerifyELF()
  		error_normal LINT "$f" 'eu-elflint failed'
  	fi

-	verify_rpath "$f" "$(printf %s "$objdump_info" |awk '{if ($1=="RPATH") print $2}')"
+	verify_rpath "$f" "$(printf %s "$objdump_info" |awk '{if ($1=="RPATH"||$1=="RUNPATH") print $2}')"

  	if [ -z "${t##*ELF* executable*}" -o -z "${t##*ELF* shared object*}" ]; then
  		verify_stack "$f"
@@ -376,7 +376,7 @@ VerifyELF()

  	if [ -z "${t##*ELF* executable*dynamically linked*}" -o -z "${t##*ELF* shared object*}" ]; then
  		verify_unresolved "$f" "$preload" "$fname" \
-			"$(printf %s "$objdump_info" |awk '{if ($1=="RPATH") print $2}' |tr -s : ' ' |sed -e "s|\$ORIGIN|${fname%/*}|g")"
+			"$(printf %s "$objdump_info" |awk '{if ($1=="RPATH"||$1=="RUNPATH") print $2}' |tr -s : ' ' |sed -e "s|\$ORIGIN|${fname%/*}|g")"
  		if [ -z "${t##*ELF 32-bit*}" ]; then
  			verify_lfs "$f"
  		fi
-- 


> http: //git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=blob;f=scripts/verify-elf.in;h=316117f05428961b85fa4428f86f4e6f9f0a7968;hb=HEAD#l378
>
> 		 verify_unresolved "$f" "$preload" "$fname" \
> 			 "$(printf %s "$objdump_info" |awk '{if ($1=="RPATH")
> 			 print $2}' |tr -s : ' ' |sed -e
> 			 "s|\$ORIGIN|${fname%/*}|g")"
>
> lib.req.in:95:		 awk '($1=="RPATH"||$1=="RUNPATH"){print $2}' |
>
> Спасибо за предоставленный более полный материал (хотя бы в виде бинарника) к 
> этому, получается, багрепорту.
>
>>  У Вас есть под рукой бинарник plugin-container, который должен был бы
>>  работать, но verify-elf не проходит? (verify-elf и т.п. можно запускать
>>  отдельной командой, не во время сборки.) Без всяких дополнительных
>>  редактирований. Просто нам остальным не так просто его получить -- процесс
>>  сборки тяжёлый -- чтобы потом поизучать. Напишите побольше подробностей
>>  про один конкретный бинарник (verify-elf, objdump для начала), чтобы
>>  ситуация была яснее.
>>
>>  --
>>  Best regards,
>>  Ivan
>> 
>


Подробная информация о списке рассылки Devel