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 | |
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>
-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 | ||