Bug 32826 - verify_rpath when both RUNPATH and RPATH are set
Summary: verify_rpath when both RUNPATH and RPATH are set
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: rpm-build (show other bugs)
Version: unstable
Hardware: all Linux
: P3 enhancement
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 32821
  Show dependency tree
 
Reported: 2016-11-30 13:23 MSK by Ivan Zakharyaschev
Modified: 2016-12-01 10:06 MSK (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ivan Zakharyaschev 2016-11-30 13:23:32 MSK
rpm-build-4.0.4-alt100.95

In the last release, I have made verify-elf to pass both RUNPATH and RPATH to verify_rpath(). This is a buggy.

If both are set, now, this makes such ELFs be discarded:


$ RPM_BUILD_ROOT=/usr /usr/lib/rpm/verify-elf /usr/lib64/libdw-0.155.so
section [18] '.tbss': alloc flag set but section not in any loaded segment
verify-elf: ERROR: /usr/lib64/libdw-0.155.so: eu-elflint failed
verify-elf: ERROR: /usr/lib64/libdw-0.155.so: RPATH contains a non-ascii entry: /usr/lib64/elfutils
/usr/lib64/elfutils
verify-elf: ERROR: /usr/lib64/libdw-0.155.so: RPATH contains illegal entry "/usr": /usr/lib64/elfutils
/usr/lib64/elfutils
$ objdump -p /usr/lib64/libdw-0.155.so | fgrep PATH
  RPATH                /usr/lib64/elfutils
  RUNPATH              /usr/lib64/elfutils
$ rpm -qf /usr/lib64/libdw-0.155.so
elfutils-0.155-alt2
$ 

(This is an old version of elfutils, just used as an example here.)

Hopefully, this is a very rare case that both are set in Sisyphus.

This case should be error_strict.

(I have overlooked that in verify_rpath(), unlike in other 3 cses where rpath is analyzed, it is not split into lines by : first.)

BTW, here is an example of the output of LD_DEBUG=libs , which I'd like to use in a further enhancement to get the standard search path (and to prefix it with RPM_BUILD_ROOT) -- to be as close to the real behavior of the runtime linker as possible. (As for verify_rpath()'s check for the presence of standard patsh in rpath, it should probably take into account not only the arch-specific set of search paths, but all possible ones as looked into by ldconfig, because their presence may signal an error, too.)


$ LD_TRACE_LOADED_OBJECTS=1 LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 --inhibit-cache /usr/lib64/libdw-0.155.so
      9473:	find library=libelf.so.1 [0]; searching
      9473:	 search path=/usr/lib64/elfutils/tls/x86_64:/usr/lib64/elfutils/tls:/usr/lib64/elfutils/x86_64:/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/tls/x86_64/libelf.so.1
      9473:	  trying file=/usr/lib64/elfutils/tls/libelf.so.1
      9473:	  trying file=/usr/lib64/elfutils/x86_64/libelf.so.1
      9473:	  trying file=/usr/lib64/elfutils/libelf.so.1
      9473:	 search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/tls/x86_64/libelf.so.1
      9473:	  trying file=/lib64/tls/libelf.so.1
      9473:	  trying file=/lib64/x86_64/libelf.so.1
      9473:	  trying file=/lib64/libelf.so.1
      9473:	  trying file=/usr/lib64/tls/x86_64/libelf.so.1
      9473:	  trying file=/usr/lib64/tls/libelf.so.1
      9473:	  trying file=/usr/lib64/x86_64/libelf.so.1
      9473:	  trying file=/usr/lib64/libelf.so.1
      9473:	
      9473:	find library=libdl.so.2 [0]; searching
      9473:	 search path=/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/libdl.so.2
      9473:	 search path=/lib64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/libdl.so.2
      9473:	
      9473:	find library=liblzma.so.5 [0]; searching
      9473:	 search path=/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/liblzma.so.5
      9473:	 search path=/lib64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/liblzma.so.5
      9473:	
      9473:	find library=libbz2.so.1 [0]; searching
      9473:	 search path=/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/libbz2.so.1
      9473:	 search path=/lib64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/libbz2.so.1
      9473:	
      9473:	find library=libz.so.1 [0]; searching
      9473:	 search path=/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/libz.so.1
      9473:	 search path=/lib64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/libz.so.1
      9473:	
      9473:	find library=libgcc_s.so.1 [0]; searching
      9473:	 search path=/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/libgcc_s.so.1
      9473:	 search path=/lib64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/libgcc_s.so.1
      9473:	
      9473:	find library=libc.so.6 [0]; searching
      9473:	 search path=/usr/lib64/elfutils		(RUNPATH from file /usr/lib64/libdw-0.155.so)
      9473:	  trying file=/usr/lib64/elfutils/libc.so.6
      9473:	 search path=/lib64:/usr/lib64		(system search path)
      9473:	  trying file=/lib64/libc.so.6
      9473:	
	linux-vdso.so.1 (0x00007fff157fe000)
	libelf.so.1 => /usr/lib64/libelf.so.1 (0x0000003de3400000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003ddc800000)
	liblzma.so.5 => /lib64/liblzma.so.5 (0x0000003dec200000)
	libbz2.so.1 => /lib64/libbz2.so.1 (0x0000003df0800000)
	libz.so.1 => /lib64/libz.so.1 (0x0000003ddd400000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003dddc00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003ddc400000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003ddc000000)
$
Comment 1 Ivan Zakharyaschev 2016-11-30 13:25:21 MSK
$ RPM_BUILD_ROOT=/var/empty /usr/lib/rpm/verify-elf /usr/lib64/libdw-0.155.so
section [18] '.tbss': alloc flag set but section not in any loaded segment
verify-elf: ERROR: /usr/lib64/libdw-0.155.so: eu-elflint failed
verify-elf: ERROR: /usr/lib64/libdw-0.155.so: RPATH contains a non-ascii entry: /usr/lib64/elfutils
/usr/lib64/elfutils
$
Comment 2 Repository Robot 2016-11-30 20:07:10 MSK
rpm-4.0.4-alt100.96 -> sisyphus:

* Wed Nov 30 2016 Ivan Zakharyaschev <imz@altlinux> 4.0.4-alt100.96
- verify-elf: don't confuse the initial verify_rpath() in case
  of two RUNPATH/RPATHs (ALT#32826).