]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared: nudge people into sending us patches to make /lib64/ symlink generation work...
authorLennart Poettering <lennart@poettering.net>
Wed, 10 Nov 2021 11:35:27 +0000 (12:35 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 10 Nov 2021 14:18:01 +0000 (15:18 +0100)
This is an attempt to nudge people into sending us patches that fix
bug #14311 for us, given that the original submitter lost interest.

src/shared/base-filesystem.c

index 016eb7b82a733590e7626a22a96a35f7b04d6abb..47c1ea2802a7f1ed2d0d36e08d8d13136f96776f 100644 (file)
 #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;