Currently, Buildroot installs the jre libraries using cp -dprf /build/linux-*-release/images/jre/lib/* $(TARGET_DIR)/usr/lib/ However, if a system has a merged /usr directory, and there is a built kernel before installing OpenJDK, the installation fails because jre/lib has binary modules file, which causes the following error: cp: cannot overwrite directory '/usr/lib/modules with non-directory The obvious fix is to install the modules to /usr/lib/jvm/ and set the appropriate rpaths via the --with-extra-ldflags conf option. However, this fix does not work because the built binaries themselves do not link against libjava.so Indeed, running readelf on the built java binary reports the following: "(RUNPATH) Library runpath: [/usr/lib/jvm]" and /usr/lib/jvm/libjava.so exists. However, when running the Java binary on the target, the following error occurs: "Error: could not find libjava.so." The following is the result of "strace java" ran on the target: faccessat(AT_FDCWD, "/usr/lib/libjava.so", F_OK) = -1 ENOENT faccessat(AT_FDCWD, "/usr/jre/lib/libjava.so", F_OK) = -1 ENOENT newfstatat(AT_FDCWD, "/usr/lib/libjava.so", 0x7ffe7b4af8, 0) = -1 ENOENT newfstatat(AT_FDCWD, "/usr/lib/jvm/libjli.so", [sic] AT_SYMLINK_NOFOLLOW) = 0 As seen above, the java binary searches for libjli.so in /usr/lib/jvm, which demonstrates that the java binary searches for some of the DT_NEEDED libraries using the correct rpath. But libjava.so is not searched from the rpath; it is instead dl-opened manually, looked for in the search paths hardcoded to the following directories: - /usr/lib/ - /usr/jre/lib/ - $(dirname $0)/../lib/ The reason behind the hardcoded paths given by the maintainers is due to historical purposes for the need to support several java versions at the same time on a single system, and that changing the above behavior is not likely to ever happen. As such, most distributions such as Redhat do the following: - Create the directory /usr/lib/jvm/java-$(JAVA_VERSION)/ - Install all directories and files found in images/jre to that directory. - Symlink the binaries to in /usr/lib/jvm/java-$(JAVA_VERSION)/bin to /usr/bin. However, because Buildroot does not need to support multiple versions of java concurrently, there is no need for the additional java-$(JAVA_VERSION) directory. To fix the above issue, the following changes are performed: - Introduce the variable "OPENJDK_INSTALL_BASE" which points to /usr/lib/jvm - Set the --with-extra-ldflags conf_opt to "-Wl,-rpath,$(OPENJDK_INSTALL_BASE)/lib,-rpath, $(OPENJDK_INSTALL_BASE)/lib/$(OPENJDK_JVM_VARIANT)" - Run "mkdir -p $(TARGET_DIR)/usr/lib/jvm/" in the INSTALL_TARGET_CMDS step. - Copy both the lib and bin directories to /usr/lib/jvm/ - Symlink the binaries in /usr/lib/jvm/bin/ to /usr/bin. Fixes: https://bugs.busybox.net/show_bug.cgi?id=12751 Signed-off-by: Adam Duskett <Aduskett@gmail.com> Reviewed-by: Ryan Barnett <ryan.barnett@rockwellcollins.com> Tested-by: Ryan Barnett <ryan.barnett@rockwellcollins.com> [yann.morin.1998@free.fr: fix two remaining mis-placed '/'] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> |
||
---|---|---|
arch | ||
board | ||
boot | ||
configs | ||
docs | ||
fs | ||
linux | ||
package | ||
support | ||
system | ||
toolchain | ||
utils | ||
.defconfig | ||
.flake8 | ||
.gitignore | ||
.gitlab-ci.yml | ||
.gitlab-ci.yml.in | ||
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