#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;
{ "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;