From: Lennart Poettering Date: Wed, 10 Nov 2021 11:35:27 +0000 (+0100) Subject: shared: nudge people into sending us patches to make /lib64/ symlink generation work... X-Git-Tag: v250-rc1~312^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=04ba1bb038bb565cbfeafe63cb3518eb4840836d;p=thirdparty%2Fsystemd.git shared: nudge people into sending us patches to make /lib64/ symlink generation work on all archs that need it This is an attempt to nudge people into sending us patches that fix bug #14311 for us, given that the original submitter lost interest. --- diff --git a/src/shared/base-filesystem.c b/src/shared/base-filesystem.c index 016eb7b82a7..47c1ea2802a 100644 --- a/src/shared/base-filesystem.c +++ b/src/shared/base-filesystem.c @@ -20,10 +20,10 @@ #include "user-util.h" typedef struct BaseFilesystem { - const char *dir; + const char *dir; /* directory or symlink to create */ mode_t mode; - const char *target; - const char *exists; + const char *target; /* if non-NULL create as symlink to this target */ + const char *exists; /* conditionalize this entry on existance of this file */ bool ignore_failure; } BaseFilesystem; @@ -39,11 +39,26 @@ static const BaseFilesystem table[] = { { "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" "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 #endif }; +#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. */ +#endif + int base_filesystem_create(const char *root, uid_t uid, gid_t gid) { _cleanup_close_ int fd = -1; int r;