diff options
| author | Khem Raj <raj.khem@gmail.com> | 2018-03-20 13:06:28 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-03-25 09:40:42 +0100 |
| commit | 12392552b29830a2d45237c5601e5ed3a426e1f4 (patch) | |
| tree | db80623e8be5f3be3d55e9a417ea4bd005322b6b /meta/recipes-core | |
| parent | 4a84bff9a669197001bcdc6e048c4e8c2dea0518 (diff) | |
| download | poky-12392552b29830a2d45237c5601e5ed3a426e1f4.tar.gz | |
systemd: Fix build failures with glibc 2.27 + kernels without memfd
Backport a fix that is needed for systemd to build with latest glibc
and kernel being old.
see
https://github.com/systemd/systemd/issues/8099
(From OE-Core rev: 169d061b313ebb91bf18f09d998a42c4ae165bf8)
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-core')
| -rw-r--r-- | meta/recipes-core/systemd/systemd/0032-memfd.patch | 272 | ||||
| -rw-r--r-- | meta/recipes-core/systemd/systemd_237.bb | 1 |
2 files changed, 273 insertions, 0 deletions
diff --git a/meta/recipes-core/systemd/systemd/0032-memfd.patch b/meta/recipes-core/systemd/systemd/0032-memfd.patch new file mode 100644 index 0000000000..f7cfd60a3f --- /dev/null +++ b/meta/recipes-core/systemd/systemd/0032-memfd.patch | |||
| @@ -0,0 +1,272 @@ | |||
| 1 | missing_syscall: when adding syscall replacements, use different names ( | ||
| 2 | |||
| 3 | #8229) | ||
| 4 | |||
| 5 | In meson.build we check that functions are available using: | ||
| 6 | meson.get_compiler('c').has_function('foo') | ||
| 7 | which checks the following: | ||
| 8 | - if __stub_foo or __stub___foo are defined, return false | ||
| 9 | - if foo is declared (a pointer to the function can be taken), return true | ||
| 10 | - otherwise check for __builtin_memfd_create | ||
| 11 | |||
| 12 | _stub is documented by glibc as | ||
| 13 | It defines a symbol '__stub_FUNCTION' for each function | ||
| 14 | in the C library which is a stub, meaning it will fail | ||
| 15 | every time called, usually setting errno to ENOSYS. | ||
| 16 | |||
| 17 | So if __stub is defined, we know we don't want to use the glibc version, but | ||
| 18 | this doesn't tell us if the name itself is defined or not. If it _is_ defined, | ||
| 19 | and we define our replacement as an inline static function, we get an error: | ||
| 20 | |||
| 21 | In file included from ../src/basic/missing.h:1358:0, | ||
| 22 | from ../src/basic/util.h:47, | ||
| 23 | from ../src/basic/calendarspec.h:29, | ||
| 24 | from ../src/basic/calendarspec.c:34: | ||
| 25 | ../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration | ||
| 26 | static inline int memfd_create(const char *name, unsigned int flags) { | ||
| 27 | ^~~~~~~~~~~~ | ||
| 28 | .../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here | ||
| 29 | int memfd_create (const char *__name, unsigned int __flags) __THROW; | ||
| 30 | ^~~~~~~~~~~~ | ||
| 31 | |||
| 32 | To avoid this problem, call our inline functions different than glibc, | ||
| 33 | and use a #define to map the official name to our replacement. | ||
| 34 | |||
| 35 | Fixes #8099. | ||
| 36 | |||
| 37 | v2: | ||
| 38 | - use "missing_" as the prefix instead of "_" | ||
| 39 | |||
| 40 | v3: | ||
| 41 | - rebase and update for statx() | ||
| 42 | |||
| 43 | Unfortunately "statx" is also present in "struct statx", so the define | ||
| 44 | causes issues. Work around this by using a typedef. | ||
| 45 | |||
| 46 | I checked that systemd compiles with current glibc | ||
| 47 | (glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID, | ||
| 48 | HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL, | ||
| 49 | HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0. | ||
| 50 | |||
| 51 | Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of | ||
| 52 | the define, but because of struct file_handle. | ||
| 53 | |||
| 54 | |||
| 55 | backport https://github.com/systemd/systemd/commit/5187dd2c403caf92d09f3491e41f1ceb3f10491f | ||
| 56 | |||
| 57 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
| 58 | Upstream-Status: Backport [https://github.com/systemd/systemd/issues/8099] | ||
| 59 | Index: git/src/basic/missing_syscall.h | ||
| 60 | =================================================================== | ||
| 61 | --- git.orig/src/basic/missing_syscall.h | ||
| 62 | +++ git/src/basic/missing_syscall.h | ||
| 63 | @@ -26,9 +26,11 @@ | ||
| 64 | #include <sys/types.h> | ||
| 65 | |||
| 66 | #if !HAVE_PIVOT_ROOT | ||
| 67 | -static inline int pivot_root(const char *new_root, const char *put_old) { | ||
| 68 | +static inline int missing_pivot_root(const char *new_root, const char *put_old) { | ||
| 69 | return syscall(SYS_pivot_root, new_root, put_old); | ||
| 70 | } | ||
| 71 | + | ||
| 72 | +# define pivot_root missing_pivot_root | ||
| 73 | #endif | ||
| 74 | |||
| 75 | #if !HAVE_CANONICALIZE_FILE_NAME | ||
| 76 | @@ -68,7 +70,7 @@ static inline char *canonicalize_file_na | ||
| 77 | # endif | ||
| 78 | # endif | ||
| 79 | |||
| 80 | -static inline int memfd_create(const char *name, unsigned int flags) { | ||
| 81 | +static inline int missing_memfd_create(const char *name, unsigned int flags) { | ||
| 82 | # ifdef __NR_memfd_create | ||
| 83 | return syscall(__NR_memfd_create, name, flags); | ||
| 84 | # else | ||
| 85 | @@ -76,6 +78,8 @@ static inline int memfd_create(const cha | ||
| 86 | return -1; | ||
| 87 | # endif | ||
| 88 | } | ||
| 89 | + | ||
| 90 | +# define memfd_create missing_memfd_create | ||
| 91 | #endif | ||
| 92 | |||
| 93 | /* ======================================================================= */ | ||
| 94 | @@ -115,7 +119,7 @@ static inline int memfd_create(const cha | ||
| 95 | # endif | ||
| 96 | # endif | ||
| 97 | |||
| 98 | -static inline int getrandom(void *buffer, size_t count, unsigned flags) { | ||
| 99 | +static inline int missing_getrandom(void *buffer, size_t count, unsigned flags) { | ||
| 100 | # ifdef __NR_getrandom | ||
| 101 | return syscall(__NR_getrandom, buffer, count, flags); | ||
| 102 | # else | ||
| 103 | @@ -123,14 +127,18 @@ static inline int getrandom(void *buffer | ||
| 104 | return -1; | ||
| 105 | # endif | ||
| 106 | } | ||
| 107 | + | ||
| 108 | +# define getrandom missing_getrandom | ||
| 109 | #endif | ||
| 110 | |||
| 111 | /* ======================================================================= */ | ||
| 112 | |||
| 113 | #if !HAVE_GETTID | ||
| 114 | -static inline pid_t gettid(void) { | ||
| 115 | +static inline pid_t missing_gettid(void) { | ||
| 116 | return (pid_t) syscall(SYS_gettid); | ||
| 117 | } | ||
| 118 | + | ||
| 119 | +# define gettid missing_gettid | ||
| 120 | #endif | ||
| 121 | |||
| 122 | /* ======================================================================= */ | ||
| 123 | @@ -158,7 +166,7 @@ struct file_handle { | ||
| 124 | unsigned char f_handle[0]; | ||
| 125 | }; | ||
| 126 | |||
| 127 | -static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) { | ||
| 128 | +static inline int missing_name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) { | ||
| 129 | # ifdef __NR_name_to_handle_at | ||
| 130 | return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags); | ||
| 131 | # else | ||
| 132 | @@ -166,6 +174,8 @@ static inline int name_to_handle_at(int | ||
| 133 | return -1; | ||
| 134 | # endif | ||
| 135 | } | ||
| 136 | + | ||
| 137 | +# define name_to_handle_at missing_name_to_handle_at | ||
| 138 | #endif | ||
| 139 | |||
| 140 | /* ======================================================================= */ | ||
| 141 | @@ -183,7 +193,7 @@ static inline int name_to_handle_at(int | ||
| 142 | # endif | ||
| 143 | # endif | ||
| 144 | |||
| 145 | -static inline int setns(int fd, int nstype) { | ||
| 146 | +static inline int missing_setns(int fd, int nstype) { | ||
| 147 | # ifdef __NR_setns | ||
| 148 | return syscall(__NR_setns, fd, nstype); | ||
| 149 | # else | ||
| 150 | @@ -191,6 +201,8 @@ static inline int setns(int fd, int nsty | ||
| 151 | return -1; | ||
| 152 | # endif | ||
| 153 | } | ||
| 154 | + | ||
| 155 | +# define setns missing_setns | ||
| 156 | #endif | ||
| 157 | |||
| 158 | /* ======================================================================= */ | ||
| 159 | @@ -236,7 +248,7 @@ static inline pid_t raw_getpid(void) { | ||
| 160 | # endif | ||
| 161 | # endif | ||
| 162 | |||
| 163 | -static inline int renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) { | ||
| 164 | +static inline int missing_renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) { | ||
| 165 | # ifdef __NR_renameat2 | ||
| 166 | return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags); | ||
| 167 | # else | ||
| 168 | @@ -244,12 +256,14 @@ static inline int renameat2(int oldfd, c | ||
| 169 | return -1; | ||
| 170 | # endif | ||
| 171 | } | ||
| 172 | + | ||
| 173 | +# define renameat2 missing_renameat2 | ||
| 174 | #endif | ||
| 175 | |||
| 176 | /* ======================================================================= */ | ||
| 177 | |||
| 178 | #if !HAVE_KCMP | ||
| 179 | -static inline int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) { | ||
| 180 | +static inline int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) { | ||
| 181 | # ifdef __NR_kcmp | ||
| 182 | return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2); | ||
| 183 | # else | ||
| 184 | @@ -257,36 +271,44 @@ static inline int kcmp(pid_t pid1, pid_t | ||
| 185 | return -1; | ||
| 186 | # endif | ||
| 187 | } | ||
| 188 | + | ||
| 189 | +# define kcmp missing_kcmp | ||
| 190 | #endif | ||
| 191 | |||
| 192 | /* ======================================================================= */ | ||
| 193 | |||
| 194 | #if !HAVE_KEYCTL | ||
| 195 | -static inline long keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4,unsigned long arg5) { | ||
| 196 | +static inline long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4,unsigned long arg5) { | ||
| 197 | # ifdef __NR_keyctl | ||
| 198 | return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5); | ||
| 199 | # else | ||
| 200 | errno = ENOSYS; | ||
| 201 | return -1; | ||
| 202 | # endif | ||
| 203 | + | ||
| 204 | +# define keyctl missing_keyctl | ||
| 205 | } | ||
| 206 | |||
| 207 | -static inline key_serial_t add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) { | ||
| 208 | +static inline key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) { | ||
| 209 | # ifdef __NR_add_key | ||
| 210 | return syscall(__NR_add_key, type, description, payload, plen, ringid); | ||
| 211 | # else | ||
| 212 | errno = ENOSYS; | ||
| 213 | return -1; | ||
| 214 | # endif | ||
| 215 | + | ||
| 216 | +# define add_key missing_add_key | ||
| 217 | } | ||
| 218 | |||
| 219 | -static inline key_serial_t request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) { | ||
| 220 | +static inline key_serial_t missing_request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) { | ||
| 221 | # ifdef __NR_request_key | ||
| 222 | return syscall(__NR_request_key, type, description, callout_info, destringid); | ||
| 223 | # else | ||
| 224 | errno = ENOSYS; | ||
| 225 | return -1; | ||
| 226 | # endif | ||
| 227 | + | ||
| 228 | +# define request_key missing_request_key | ||
| 229 | } | ||
| 230 | #endif | ||
| 231 | |||
| 232 | @@ -313,10 +335,10 @@ static inline key_serial_t request_key(c | ||
| 233 | # endif | ||
| 234 | # endif | ||
| 235 | |||
| 236 | -static inline ssize_t copy_file_range(int fd_in, loff_t *off_in, | ||
| 237 | - int fd_out, loff_t *off_out, | ||
| 238 | - size_t len, | ||
| 239 | - unsigned int flags) { | ||
| 240 | +static inline ssize_t missing_copy_file_range(int fd_in, loff_t *off_in, | ||
| 241 | + int fd_out, loff_t *off_out, | ||
| 242 | + size_t len, | ||
| 243 | + unsigned int flags) { | ||
| 244 | # ifdef __NR_copy_file_range | ||
| 245 | return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags); | ||
| 246 | # else | ||
| 247 | @@ -324,6 +346,8 @@ static inline ssize_t copy_file_range(in | ||
| 248 | return -1; | ||
| 249 | # endif | ||
| 250 | } | ||
| 251 | + | ||
| 252 | +# define copy_file_range missing_copy_file_range | ||
| 253 | #endif | ||
| 254 | |||
| 255 | /* ======================================================================= */ | ||
| 256 | @@ -351,7 +375,7 @@ static inline ssize_t copy_file_range(in | ||
| 257 | |||
| 258 | union bpf_attr; | ||
| 259 | |||
| 260 | -static inline int bpf(int cmd, union bpf_attr *attr, size_t size) { | ||
| 261 | +static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) { | ||
| 262 | #ifdef __NR_bpf | ||
| 263 | return (int) syscall(__NR_bpf, cmd, attr, size); | ||
| 264 | #else | ||
| 265 | @@ -360,6 +384,7 @@ static inline int bpf(int cmd, union bpf | ||
| 266 | #endif | ||
| 267 | } | ||
| 268 | |||
| 269 | +# define bpf missing_bpf | ||
| 270 | #endif | ||
| 271 | |||
| 272 | /* ======================================================================= */ | ||
diff --git a/meta/recipes-core/systemd/systemd_237.bb b/meta/recipes-core/systemd/systemd_237.bb index ecf8e74940..e6336db0de 100644 --- a/meta/recipes-core/systemd/systemd_237.bb +++ b/meta/recipes-core/systemd/systemd_237.bb | |||
| @@ -49,6 +49,7 @@ SRC_URI += "file://touchscreen.rules \ | |||
| 49 | file://0029-nss-mymachines-Build-conditionally-when-ENABLE_MYHOS.patch \ | 49 | file://0029-nss-mymachines-Build-conditionally-when-ENABLE_MYHOS.patch \ |
| 50 | file://0030-fix-missing-of-__register_atfork-for-non-glibc-build.patch \ | 50 | file://0030-fix-missing-of-__register_atfork-for-non-glibc-build.patch \ |
| 51 | file://0031-fix-missing-ULONG_LONG_MAX-definition-in-case-of-mus.patch \ | 51 | file://0031-fix-missing-ULONG_LONG_MAX-definition-in-case-of-mus.patch \ |
| 52 | file://0032-memfd.patch \ | ||
| 52 | " | 53 | " |
| 53 | SRC_URI_append_qemuall = " file://0001-core-device.c-Change-the-default-device-timeout-to-2.patch" | 54 | SRC_URI_append_qemuall = " file://0001-core-device.c-Change-the-default-device-timeout-to-2.patch" |
| 54 | 55 | ||
