bcdb74512d
Our patch 0003-Add-option-to-make-the-rpath-relative-under-a-specif.patch adds an option --make-rpath-relative, which we use to tweak RPATH of target binaries. However, one of the effect of this option is that it drops RPATH entries if the corresponding directory does not contain a library that is referenced by a DT_NEEDED entry of the binary. This unfortunately isn't correct, as RPATH entries are not only used by the dynamic linker to resolve the location of libraries listed through DT_NEEDED entries: RPATH entries are also used by dlopen() when resolving the location of libraries that are loaded at runtime. Therefore, the removal of RPATH entries that don't correspond to directories containing libraries referenced by DT_NEEDED entries break legitimate uses of RPATH for dlopen()ed libraries. This issue was even pointed out during the review of the upstream pull request: https://github.com/NixOS/patchelf/pull/118#discussion_r329660138 This fixes tst-origin uClibc-ng unit test: https://github.com/wbx-github/uclibc-ng-test/blob/master/test/dlopen/Makefile.in#L25 https://github.com/wbx-github/uclibc-ng-test/blob/master/test/dlopen/tst-origin.c#L15 Without this patch: $ gcc -o toto toto.c -Wl,-rpath,/tmp/test/bar $ readelf -d toto | grep PATH 0x000000000000000f (RPATH) Library rpath: [/tmp/test/bar] $ ./output/host/bin/patchelf --debug --make-rpath-relative /tmp/ toto patching ELF file `toto' Kernel page size is 4096 bytes removing directory '/tmp/test/bar' from RPATH because it does not contain needed libs new rpath is `' $ readelf -d toto | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [] With the patch applied: $ gcc -o toto toto.c -Wl,-rpath,/tmp/test/bar $ readelf -d toto | grep PATH 0x000000000000000f (RPATH) Library rpath: [/tmp/test/bar] $ ./output/host/bin/patchelf --debug --make-rpath-relative /tmp/ toto patching ELF file `toto' Kernel page size is 4096 bytes keeping relative path of /tmp/test/bar new rpath is `test/bar' $ readelf -d toto | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [test/bar] Signed-off-by: Yann Sionneau <ysionneau@kalray.eu> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> |
||
---|---|---|
arch | ||
board | ||
boot | ||
configs | ||
docs | ||
fs | ||
linux | ||
package | ||
support | ||
system | ||
toolchain | ||
utils | ||
.defconfig | ||
.flake8 | ||
.gitignore | ||
.gitlab-ci.yml | ||
CHANGES | ||
Config.in | ||
Config.in.legacy | ||
COPYING | ||
DEVELOPERS | ||
Makefile | ||
Makefile.legacy | ||
README |
Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through cross-compilation. The documentation can be found in docs/manual. You can generate a text document with 'make manual-text' and read output/docs/manual/manual.text. Online documentation can be found at http://buildroot.org/docs.html To build and use the buildroot stuff, do the following: 1) run 'make menuconfig' 2) select the target architecture and the packages you wish to compile 3) run 'make' 4) wait while it compiles 5) find the kernel, bootloader, root filesystem, etc. in output/images You do not need to be root to build or run buildroot. Have fun! Buildroot comes with a basic configuration for a number of boards. Run 'make list-defconfigs' to view the list of provided configurations. Please feed suggestions, bug reports, insults, and bribes back to the buildroot mailing list: buildroot@buildroot.org You can also find us on #buildroot on Freenode IRC. If you would like to contribute patches, please read https://buildroot.org/manual.html#submitting-patches