diff options
Diffstat (limited to 'src/shared/base-filesystem.c')
-rw-r--r-- | src/shared/base-filesystem.c | 67 |
1 files changed, 58 insertions, 9 deletions
diff --git a/src/shared/base-filesystem.c b/src/shared/base-filesystem.c index 47c1ea2802..aede7171c1 100644 --- a/src/shared/base-filesystem.c +++ b/src/shared/base-filesystem.c @@ -9,6 +9,7 @@ #include <unistd.h> #include "alloc-util.h" +#include "architecture.h" #include "base-filesystem.h" #include "fd-util.h" #include "log.h" @@ -38,25 +39,73 @@ static const BaseFilesystem table[] = { { "proc", 0755, NULL, NULL, true }, { "sys", 0755, NULL, NULL, true }, { "dev", 0755, NULL, NULL, true }, -#if defined(__i386__) || defined(__x86_64__) + /* Various architecture ABIs define the path to the dynamic loader via the /lib64/ subdirectory of * the root directory. When booting from an otherwise empty root file system (where only /usr/ has * been mounted into) it is thus necessary to create a symlink pointing to the right subdirectory of * /usr/ first — otherwise we couldn't invoke any dynamic binary. Let's detect this case here, and * create the symlink as needed should it be missing. We prefer doing this consistently with Debian's * multiarch logic, but support Fedora-style multilib too.*/ - { "lib64", 0, "usr/lib/x86_64-linux-gnu\0" +#if defined(__aarch64__) + /* aarch64 ELF ABI actually says dynamic loader is in /lib/, but Fedora puts it in /lib64/ anyway and + * just symlinks /lib/ld-linux-aarch64.so.1 to ../lib64/ld-linux-aarch64.so.1. For this to work + * correctly, /lib64/ must be symlinked to /usr/lib64/. */ + { "lib64", 0, "usr/lib/"LIB_ARCH_TUPLE"\0" + "usr/lib64\0", "ld-linux-aarch64.so.1" }, +# define KNOW_LIB64_DIRS 1 +#elif defined(__alpha__) +#elif defined(__arc__) || defined(__tilegx__) +#elif defined(__arm__) + /* No /lib64 on arm. The linker is /lib/ld-linux-armhf.so.3. */ +# define KNOW_LIB64_DIRS 1 +#elif defined(__i386__) || defined(__x86_64__) + { "lib64", 0, "usr/lib/"LIB_ARCH_TUPLE"\0" "usr/lib64\0", "ld-linux-x86-64.so.2" }, -#else - /* gcc doesn't allow pragma to be used within constructs, hence log about this separately below */ -# define WARN_LIB64 1 +# define KNOW_LIB64_DIRS 1 +#elif defined(__ia64__) +#elif defined(__m68k__) + /* No link needed. */ +# define KNOW_LIB64_DIRS 1 +#elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# else +# error "Unknown MIPS ABI" +# endif +#elif defined(__powerpc__) +# if defined(__PPC64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + { "lib64", 0, "usr/lib/"LIB_ARCH_TUPLE"\0" + "usr/lib64\0", "ld64.so.2" }, +# define KNOW_LIB64_DIRS 1 +# elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + /* powerpc64-linux-gnu */ +# else + /* powerpc-linux-gnu */ +# endif +#elif defined(__riscv) +# if __riscv_xlen == 32 +# elif __riscv_xlen == 64 + /* Same situation as for aarch64 */ + { "lib64", 0, "usr/lib/"LIB_ARCH_TUPLE"\0" + "usr/lib64\0", "ld-linux-riscv64-lp64d.so.1" }, +# define KNOW_LIB64_DIRS 1 +# else +# error "Unknown RISC-V ABI" +# endif +#elif defined(__s390__) + /* s390-linux-gnu */ +#elif defined(__s390x__) + { "lib64", 0, "usr/lib/"LIB_ARCH_TUPLE"\0" + "usr/lib64", "ld-lsb-s390x.so.3" }, +# define KNOW_LIB64_DIRS 1 +#elif defined(__sparc__) #endif + /* gcc doesn't allow pragma to be used within constructs, hence log about this separately below */ }; -#ifdef WARN_LIB64 -#pragma message "If your architecture knows a /lib64/ or /lib32/ directory, please add an entry creating it here." - /* And if your architecture doesn't know these directories, make sure to add ifdeffery here to - * suppress this pragma message. */ +#ifndef KNOW_LIB64_DIRS +# pragma message "Please add an entry above specifying whether your architecture uses /lib64/, /lib32/, or no such links." #endif int base_filesystem_create(const char *root, uid_t uid, gid_t gid) { |