ibre5041
ibre5041

Reputation: 5298

Gentoo ld generates RUNPATH in library when -Wl,-rpath is used

I have such a directory structure: symlink pointing onto directory and symlink point to a library:

$ libtrotl.so -> /usr/local/lib64/tora-3.1/../libtrotl.so
$ instantclient -> /usr/lib/oracle/12.1/client64/lib

When I dlopen library libtrotl.so, all dependent libs are resolved and loaded. Thanks to RPATH.

$ readelf -d libtrotl.so

Dynamic section at offset 0x17e7a8 contains 31 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libclntsh.so.12.1]
 0x0000000000000001 (NEEDED)             Shared library: [libboost_system.so.1.60.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libtrotl.so]
 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/instantclient/]
 0x000000000000000c (INIT)               0xe7898

$ ldd libtrotl.so 
    linux-vdso.so.1 (0x00007ffdc25d1000)
    libclntsh.so.12.1 => /home/ivan/.TOra3/poracle/./instantclient/libclntsh.so.12.1 (0x00007f6cd0c37000)
    libboost_system.so.1.60.0 => /lib64/libboost_system.so.1.60.0 (0x00007f6cd0a24000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6cd069c000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f6cd0393000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6cd017b000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6ccfdb9000)
    libmql1.so => /home/ivan/.TOra3/poracle/./instantclient/libmql1.so (0x00007f6ccfb43000)
    libipc1.so => /home/ivan/.TOra3/poracle/./instantclient/libipc1.so (0x00007f6ccf7c4000)
    libnnz12.so => /home/ivan/.TOra3/poracle/./instantclient/libnnz12.so (0x00007f6ccf0ba000)

I just use -Wl,-rpath,"\$ORIGIN/instantclient/" as compile flag and it works everywhere - except for Gentoo.

Gentoo linker(GNU gold (Gentoo 2.25.1 p1.1 2.25.1) 1.11) adds RUNPATH insead of RPATH.

 0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN/instantclient/]

Then dynamic linker does not resolve libraries.

(Gentoo)$ ldd libtrotl.so 
    linux-vdso.so.1 (0x00007ffe5c3e9000)
    libclntsh.so.12.1 => /home/ivan/.TOra3/poracle/./instantclient/libclntsh.so.12.1 (0x00007f245dc9e000)
    libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.4/libstdc++.so.6 (0x00007f245d933000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f245d62e000)
    libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.4/libgcc_s.so.1 (0x00007f245d417000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f245d07d000)
    libmql1.so => not found
    libipc1.so => not found
    libnnz12.so => not found
    libons.so => not found

As you can see, in second case library libmql1.so is not found although it is present in instantclient sub-directory. How can I set RPATH on Gentoo?

Upvotes: 0

Views: 561

Answers (1)

Diego Elio Pettenò
Diego Elio Pettenò

Reputation: 3240

DT_RPATH tags are deprecated, DT_RUNPATH is the modern implementation with a couple different semantics. Gentoo link editors (both ld and gold) will not generate the deprecated tags by default. You can (but probably shouldn't) disable these by passing -Wl,--disable-new-dtags, but that is not recommended as I said.

There is an older pot from Qt that explains the difference of these two when using plugins: http://blog.qt.io/blog/2011/10/28/rpath-and-runpath/

Upvotes: 1

Related Questions