Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove libtool preserved temporary RPATH/RUNPATH from "shared object" ELF binaries (libraries/executables) #6094

Merged
merged 51 commits into from
Feb 3, 2022

Conversation

heitbaum
Copy link
Contributor

@heitbaum heitbaum commented Jan 8, 2022

This is Part 1 of the RPATH cleanup

  1. Update ”shared object” - /lib - to remove incorrect RPATH/RUNPATH
  • This PR
  1. Update “binaries” - /sbin,/bin - to remove incorrect RPATH/RUNPATH
  1. Update “addons” - to remove incorrect RPATH/RUNPATH
  2. Revisit any missed 1, 2, 3
  3. Update buildsystem with check-rpaths
  4. Review why ldd system search path= includes variants of hardware / hwcaps library paths

Background

The buildhost cross compile hardcoded library paths e.g. /build/LibreELEC.kernel11/build.LibreELEC-iMX6.arm-11.0-devel/toolchain/armv7a-libreelec-linux-gnueabihf/sysroot/usr/lib are being included in binaries and libraries.

This was discovered by accident when I rebooted my system (which is a buildhost) with glib2.32 in the build...-Generic directory after doing a test build of my development branch with a non matching glibc (GLIB_2.33). systemd refused to start as it was using the RPATH "shared object" - not LD_LIBRARY_PATH. RPATH always comes before LD_LIBRARY_PATH

As discussed in the Fedora Packaging Guidelines - ...Since the Linux dynamic linker is usually smarter than a hardcoded path, we usually do not permit the use of rpath in Fedora.... This has not caused issue in LE - given that the JEOS is read only, and that the /lib is a point in time static when the image is generated. Though when -rpath or -R and the subsequent RPATH/RUNPATH are included in the ELF binaries/libraries and this hardcoded location information is examined by ld.so in the beginning of the execution causing the error discovered. The article Shared Libraries: Understanding Dynamic Loading by Amir Rachum is a good read to understand how dynamic loading of shared libraries works in Linux systems

The following library search path order is used for the RPATH, LD_LIBRARY_PATH, and RUNPATH:

  1. the RPATH binary header (set at build-time) of the library causing the lookup (if any)
  2. the RPATH binary header (set at build-time) of the executable
  3. the LD_LIBRARY_PATH environment variable (set at run-time)
  4. the RUNPATH binary header (set at build-time) of the executable
  5. /etc/ld.so.cache
  6. base library directories (/lib and /usr/lib)

Detail of the PR

This PR updates the "shared object" ELF binaries (libraries) to not have RPATH or RUNPATH (when it is not necessary.)

  • when the RPATH/RUNPATH contains a standard rpath
    • e.g. '/usr/lib' in RUNPATH Library runpath: [/usr/lib]
  • when RPATH/RUNPATH has the cross compile path embedded
    • e.g. RUNPATH Library runpath: [/build/LibreELEC.kernel11/build.LibreELEC-iMX6.arm-11.0-devel/toolchain/armv7a-libreelec-linux-gnueabihf/sysroot/usr/lib]

In the below example libcurl has the build path included in the shared object. This is not correct nor ideal.

cubox:~ # readelf --dynamic /lib/libcurl.so | grep PATH
  RUNPATH           Library runpath: [/build/LibreELEC.kernel11/build.LibreELEC-iMX6.arm-11.0-devel/toolchain/armv7a-libreelec-linux-gnueabihf/sysroot/usr/lib]

A further solution to be put in place (for the whole build) is the inclusion of something similar to the check-rpaths tool from rpmdevtools

Reading

Results

After the PR - the output of the /usr/lib shows only the following RPATH/RUNPATH

  • further understanding of why gconv, llvm, and pulse use RPATH/RUNPATH will be undertaken in part 4 before these are changed / updated
nuc11:~ # find /usr/lib -type f | while read x
do
  file $x | grep "shared object" > /dev/null && \
    a=`readelf --dynamic $x | grep PATH` &&
      printf "$x\t$a\n"
done

/usr/lib/gconv/EUC-CN.so          RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/EUC-JISX0213.so    RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/EUC-JP-MS.so       RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/EUC-JP.so          RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/EUC-KR.so          RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/EUC-TW.so          RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/ISO-2022-CN-EXT.so         RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/ISO-2022-CN.so     RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/ISO-2022-JP-3.so   RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/ISO-2022-JP.so     RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/ISO-2022-KR.so     RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/JOHAB.so   RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/SHIFT_JISX0213.so          RPATH             Library rpath: [$ORIGIN]
/usr/lib/gconv/UHC.so     RPATH             Library rpath: [$ORIGIN]

/usr/lib/libLLVM-13.so    RUNPATH           Library runpath: [$ORIGIN/../lib]
/usr/lib/libLTO.so.13     RUNPATH           Library runpath: [$ORIGIN/../lib]
/usr/lib/libRemarks.so.13         RUNPATH           Library runpath: [$ORIGIN/../lib]

/usr/lib/libpulse-mainloop-glib.so.0.0.6          RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/libpulse-simple.so.0.1.1         RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/libpulse.so.0.24.0       RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libalsa-util.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libavahi-wrap.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libbluez5-util.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libcli.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libprotocol-cli.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/libprotocol-http.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libprotocol-native.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libprotocol-simple.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/libraop.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/librtp.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio]
/usr/lib/pulse/module-allow-passthrough.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-alsa-card.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-alsa-sink.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-alsa-source.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-always-sink.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-always-source.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-augment-properties.so       RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-bluetooth-discover.so       RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-bluetooth-policy.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-bluez5-device.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-bluez5-discover.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-card-restore.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-cli-protocol-tcp.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-cli-protocol-unix.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-cli.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-combine-sink.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-combine.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-console-kit.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-dbus-protocol.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-default-device-restore.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-detect.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-device-manager.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-device-restore.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-echo-cancel.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-filter-apply.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-filter-heuristics.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-http-protocol-tcp.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-http-protocol-unix.so       RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-intended-roles.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-ladspa-sink.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-loopback.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-match.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-mmkbd-evdev.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-native-protocol-fd.so       RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-native-protocol-tcp.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-native-protocol-unix.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-null-sink.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-null-source.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-pipe-sink.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-pipe-source.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-position-event-sounds.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-raop-discover.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-raop-sink.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-remap-sink.so       RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-remap-source.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-rescue-streams.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-role-cork.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-role-ducking.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-rtp-recv.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-rtp-send.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-rygel-media-server.so       RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-simple-protocol-tcp.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-simple-protocol-unix.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-sine-source.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-sine.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-stream-restore.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-suspend-on-idle.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-switch-on-connect.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-switch-on-port-available.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-systemd-login.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-tunnel-sink-new.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-tunnel-sink.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-tunnel-source-new.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-tunnel-source.so    RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-udev-detect.so      RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-virtual-sink.so     RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-virtual-source.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-volume-restore.so   RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-zeroconf-discover.so        RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulse/module-zeroconf-publish.so         RUNPATH           Library runpath: [/usr/lib/pulseaudio:/usr/lib/pulse]
/usr/lib/pulseaudio/libpulsecore-15.0.so          RUNPATH           Library runpath: [/usr/lib/pulseaudio]

show the trace of libcurl which correctly finds all its dependancies (without the need to use the LD_LIBRARY_PATH - as expected)

# LD_LIBRARY_PATH= LD_DEBUG=libs ldd -v /usr/lib/libcurl.so
     18139:     find library=libm.so.6 [0]; searching
     18139:      search cache=/etc/ld.so.cache
     18139:      search path=/usr/lib/glibc-hwcaps/x86-64-v4:/usr/lib/glibc-hwcaps/x86-64-v3:/usr/lib/glibc-hwcaps/x86-64-v2:/usr/lib/tls/haswell/avx512_1/x86_64:/usr/lib/tls/haswell/avx512_1:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/avx512_1/x86_64:/usr/lib/tls/avx512_1:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/avx512_1/x86_64:/usr/lib/haswell/avx512_1:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/avx512_1/x86_64:/usr/lib/avx512_1:/usr/lib/x86_64:/usr/lib                (system search path)
     18139:       trying file=/usr/lib/glibc-hwcaps/x86-64-v4/libm.so.6
     18139:       trying file=/usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6
     18139:       trying file=/usr/lib/glibc-hwcaps/x86-64-v2/libm.so.6
     18139:       trying file=/usr/lib/tls/haswell/avx512_1/x86_64/libm.so.6
     18139:       trying file=/usr/lib/tls/haswell/avx512_1/libm.so.6
     18139:       trying file=/usr/lib/tls/haswell/x86_64/libm.so.6
     18139:       trying file=/usr/lib/tls/haswell/libm.so.6
     18139:       trying file=/usr/lib/tls/avx512_1/x86_64/libm.so.6
     18139:       trying file=/usr/lib/tls/avx512_1/libm.so.6
     18139:       trying file=/usr/lib/tls/x86_64/libm.so.6
     18139:       trying file=/usr/lib/tls/libm.so.6
     18139:       trying file=/usr/lib/haswell/avx512_1/x86_64/libm.so.6
     18139:       trying file=/usr/lib/haswell/avx512_1/libm.so.6
     18139:       trying file=/usr/lib/haswell/x86_64/libm.so.6
     18139:       trying file=/usr/lib/haswell/libm.so.6
     18139:       trying file=/usr/lib/avx512_1/x86_64/libm.so.6
     18139:       trying file=/usr/lib/avx512_1/libm.so.6
     18139:       trying file=/usr/lib/x86_64/libm.so.6
     18139:       trying file=/usr/lib/libm.so.6
     18139:     
     18139:     find library=libc.so.6 [0]; searching
     18139:      search cache=/etc/ld.so.cache
     18139:      search path=/usr/lib           (system search path)
     18139:       trying file=/usr/lib/libc.so.6
     18139:     
     18139:     
     18139:     calling init: /lib64/ld-linux-x86-64.so.2
     18139:     
     18139:     
     18139:     calling init: /usr/lib/libc.so.6
     18139:     
     18139:     
     18139:     calling init: /usr/lib/libm.so.6
     18139:     
     18139:     
     18139:     initialize program: /bin/bash
     18139:     
     18139:     
     18139:     transferring control: /bin/bash
     18139:     
     18143:     find library=libnghttp2.so.14 [0]; searching
     18143:      search cache=/etc/ld.so.cache
     18143:      search path=/usr/lib/glibc-hwcaps/x86-64-v4:/usr/lib/glibc-hwcaps/x86-64-v3:/usr/lib/glibc-hwcaps/x86-64-v2:/usr/lib/tls/haswell/avx512_1/x86_64:/usr/lib/tls/haswell/avx512_1:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/avx512_1/x86_64:/usr/lib/tls/avx512_1:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/avx512_1/x86_64:/usr/lib/haswell/avx512_1:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/avx512_1/x86_64:/usr/lib/avx512_1:/usr/lib/x86_64:/usr/lib                (system search path)
     18143:       trying file=/usr/lib/glibc-hwcaps/x86-64-v4/libnghttp2.so.14
     18143:       trying file=/usr/lib/glibc-hwcaps/x86-64-v3/libnghttp2.so.14
     18143:       trying file=/usr/lib/glibc-hwcaps/x86-64-v2/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/haswell/avx512_1/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/haswell/avx512_1/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/haswell/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/haswell/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/avx512_1/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/avx512_1/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/tls/libnghttp2.so.14
     18143:       trying file=/usr/lib/haswell/avx512_1/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/haswell/avx512_1/libnghttp2.so.14
     18143:       trying file=/usr/lib/haswell/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/haswell/libnghttp2.so.14
     18143:       trying file=/usr/lib/avx512_1/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/avx512_1/libnghttp2.so.14
     18143:       trying file=/usr/lib/x86_64/libnghttp2.so.14
     18143:       trying file=/usr/lib/libnghttp2.so.14
     18143:     
     18143:     find library=libidn2.so.0 [0]; searching
     18143:      search cache=/etc/ld.so.cache
     18143:      search path=/usr/lib           (system search path)
     18143:       trying file=/usr/lib/libidn2.so.0
     18143:     
     18143:     find library=libssl.so.3 [0]; searching
     18143:      search cache=/etc/ld.so.cache
     18143:      search path=/usr/lib           (system search path)
     18143:       trying file=/usr/lib/libssl.so.3
     18143:     
     18143:     find library=libcrypto.so.3 [0]; searching
     18143:      search cache=/etc/ld.so.cache
     18143:      search path=/usr/lib           (system search path)
     18143:       trying file=/usr/lib/libcrypto.so.3
     18143:     
     18143:     find library=libz.so.1 [0]; searching
     18143:      search cache=/etc/ld.so.cache
     18143:      search path=/usr/lib           (system search path)
     18143:       trying file=/usr/lib/libz.so.1
     18143:     
     18143:     find library=libc.so.6 [0]; searching
     18143:      search cache=/etc/ld.so.cache
     18143:      search path=/usr/lib           (system search path)
     18143:       trying file=/usr/lib/libc.so.6
     18143:     
        linux-vdso.so.1 (0x00007ffd99fc8000)
        libnghttp2.so.14 => /usr/lib/libnghttp2.so.14 (0x00007f4cf6d26000)
        libidn2.so.0 => /usr/lib/libidn2.so.0 (0x00007f4cf6cd3000)
        libssl.so.3 => /usr/lib/libssl.so.3 (0x00007f4cf6c39000)
        libcrypto.so.3 => /usr/lib/libcrypto.so.3 (0x00007f4cf6805000)
        libz.so.1 => /usr/lib/libz.so.1 (0x00007f4cf67ed000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f4cf6606000)
        /usr/lib64/ld-linux-x86-64.so.2 (0x00007f4cf6de4000)

        Version information:
        /usr/lib/libcurl.so:
                libcrypto.so.3 (OPENSSL_3.0.0) => /usr/lib/libcrypto.so.3
                libc.so.6 (GLIBC_2.3) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.34) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.33) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.17) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.7) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.14) => /usr/lib/libc.so.6
                libssl.so.3 (OPENSSL_3.0.0) => /usr/lib/libssl.so.3
                libidn2.so.0 (IDN2_0.0.0) => /usr/lib/libidn2.so.0
        /usr/lib/libnghttp2.so.14:
                libc.so.6 (GLIBC_2.2.5) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.14) => /usr/lib/libc.so.6
        /usr/lib/libidn2.so.0:
                libc.so.6 (GLIBC_2.2.5) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.14) => /usr/lib/libc.so.6
        /usr/lib/libssl.so.3:
                libcrypto.so.3 (OPENSSL_3.0.0) => /usr/lib/libcrypto.so.3
                libc.so.6 (GLIBC_2.2.5) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.14) => /usr/lib/libc.so.6
        /usr/lib/libcrypto.so.3:
                libc.so.6 (GLIBC_2.17) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.7) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.33) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.16) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.3.2) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.14) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.25) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.3) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.34) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /usr/lib/libc.so.6
        /usr/lib/libz.so.1:
                libc.so.6 (GLIBC_2.2.5) => /usr/lib/libc.so.6
                libc.so.6 (GLIBC_2.14) => /usr/lib/libc.so.6
        /usr/lib/libc.so.6:
                ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /usr/lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /usr/lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /usr/lib64/ld-linux-x86-64.so.2

@heitbaum heitbaum changed the title Remove libtool preserved temporary rpath/runpath is shared libraries Remove libtool preserved temporary rpath/runpath from "shared object" ELF binaries (libraries) Jan 8, 2022
@heitbaum heitbaum changed the title Remove libtool preserved temporary rpath/runpath from "shared object" ELF binaries (libraries) Remove libtool preserved temporary RPATH/RUNPATH from "shared object" ELF binaries (libraries) Jan 8, 2022
@heitbaum heitbaum marked this pull request as ready for review January 8, 2022 05:10
@CvH
Copy link
Member

CvH commented Jan 8, 2022

shouldn't we put sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' etc into a bash fuction ?

libtool_whatever(){
  sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g $1'
}

libtool_whatever /path/to

@vpeter4
Copy link
Contributor

vpeter4 commented Jan 8, 2022

What about just call sed on this files directly from build script on every package? If file exist run sed. If file doesn't exist do nothing. Would this do any harm? Probably not? And it would cover all packages at once without changing them manually.

@heitbaum
Copy link
Contributor Author

heitbaum commented Jan 8, 2022

What about just call sed on this files directly from build script on every package? If file exist run sed. If file doesn't exist do nothing. Would this do any harm? Probably not? And it would cover all packages at once without changing them manually.

The gettext one threw me for a while - as it’s configure documents —disable-rpath - just doesn’t flow through the the child libtools. So not easy to do ./libtool

I’m hoping that half of these identified will be resolved upstream. So given the current < 20, I would not be keen on “all” as this particular hacky fix is only relevant to configure and when it doesn’t honor —disable-rpath. Given the number of packages - there are not that many doing the “wrong thing.”

CMake has its own fix -DCMAKE_SKIP_RPATH=ON, though as I identified in libevent - libevent does not follow the CMake guideline of: # the RPATH to be used when installing, but only if it's not a system directory

@heitbaum
Copy link
Contributor Author

heitbaum commented Jan 8, 2022

shouldn't we put sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' etc into a bash fuction ?

libtool_whatever(){
  sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g $1'
}

libtool_whatever /path/to

I’m good with this approach. It makes sense given my plan with Part 5 of this series is to go with a FATAL ERROR if RPATH/RUNPATH are set (or set incorrectly.) I’d like to complete the Part 2 commits first to make sure that there aren’t any other formats / versions to be catered for.

@heitbaum
Copy link
Contributor Author

heitbaum commented Jan 8, 2022

So the Part 1 and Part 2 are done (and all addons that I use - chrome dependancies need work)

20 fixes required:

  • 1 x proper —disable-rpath fix (correct) gdb
  • 1 x ninja fix (correct) libdrm
  • 1 x custom workaround sed fix slang
  • 17 x libtool sed workaround fixes (all the same code) just different directory on gettext which has already been reported upstream.

Will proceed to create a libtool_remove_rpath() as suggested in #6094 (comment) for the 17 x libtool sed fixes

only packages/libraries to review so far for Part 4 are:

  • pulseaudio
  • gconv
  • llvm
  • systemd

@heitbaum heitbaum force-pushed the rpath-so branch 2 times, most recently from 08b4c6b to 4bccef0 Compare January 9, 2022 12:58
@heitbaum heitbaum changed the title Remove libtool preserved temporary RPATH/RUNPATH from "shared object" ELF binaries (libraries) Remove libtool preserved temporary RPATH/RUNPATH from "shared object" ELF binaries (libraries/executables) Jan 9, 2022
@heitbaum
Copy link
Contributor Author

heitbaum commented Jan 9, 2022

  • “make image” (as well as some of the addons) now all without incorrect or system lib rpaths. 🙂
  • config/function - updated
  • packages now reference the new function 👍

@heitbaum
Copy link
Contributor Author

heitbaum commented Jan 12, 2022

Added remaining 19 addons - identified via create_addon all
So additional - Step 3 completed

  • Update “addons” - to remove incorrect RPATH/RUNPATH

Following 10 updates came from Generic-legacy

@CvH
Copy link
Member

CvH commented Jan 23, 2022

rebase required

This function can be used on "autotools" and "configure" packages.

Use libtool_remove_rpath() to remove hardcode rpath when --disable-rpath
is not supported by "configure".

usage: `libtool_remove_rpath libtool`

If there are multiple libtool scripts or they are in subdirectories,
then you may need to run this function using the path to libtool or run
the function multiple times.

If binaries and shared objects installed by the package to target have
incorrect or system libraries then this function can be used. After
using the function, these example command below should NOT have a
RPATH/RUNPATH.

e.g. (before using the fucntion)
  $ readelf --dynamic ${filename} | grep PATH
    RPATH           Library runpath: [.....]
    RUNPATH         Library runpath: [.....]

Before using this function; check if the package supports
--disable-rpath (and that it works.) Work with upstream and have a
working --disable-rpath added to the package.
Remove all test programs installed by install-test-programs=true except modetest

Do not "not use" the ninja install and replace this with a simple "cp modetest"
as ninja strips the unnecessary build rpath during the install.
@heitbaum
Copy link
Contributor Author

rebase required

Rebase based to fix xf86-video-intel/package.mk

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants