[Buildroot] [git commit branch/2018.05.x] libselinux: add patch to fix build with gcc < 4.7

Peter Korsgaard peter at korsgaard.com
Fri Aug 24 08:36:15 UTC 2018


commit: https://git.buildroot.net/buildroot/commit/?id=6a8318ecfa9e6b758ad642e232f6a2fa5befefe6
branch: https://git.buildroot.net/buildroot/commit/?id=refs/heads/2018.05.x

This commit adds a patch from Hollis Blanchard on libselinux to fix
build on host machines that have gcc < 4.7.

Fixes:

  http://autobuild.buildroot.net/results/a82bb0c0b22ff24263ad7a7d165b21c0df7b3b1d/

Signed-off-by: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
(cherry picked from commit 6288409642d8368104f916bd264d2cb042942dfa)
Signed-off-by: Peter Korsgaard <peter at korsgaard.com>
---
 ...d-break-around-__atomic_-with-GCC-4.7.patch.txt | 70 ++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/package/libselinux/0004-Fix-build-break-around-__atomic_-with-GCC-4.7.patch.txt b/package/libselinux/0004-Fix-build-break-around-__atomic_-with-GCC-4.7.patch.txt
new file mode 100644
index 0000000000..85bd064066
--- /dev/null
+++ b/package/libselinux/0004-Fix-build-break-around-__atomic_-with-GCC-4.7.patch.txt
@@ -0,0 +1,70 @@
+From abe76789f8e7ce61b357f693eaed5b28feab5ce2 Mon Sep 17 00:00:00 2001
+From: Hollis Blanchard <hollis_blanchard at mentor.com>
+Date: Mon, 13 Aug 2018 12:11:33 -0700
+Subject: [PATCH] Fix build break around __atomic_*() with GCC<4.7
+
+The __atomic_* GCC primitives were introduced in GCC 4.7, but Red Hat
+Enterprise Linux 6.x (for example) provides GCC 4.4. Tweak the current code to
+use the (most conservative) __sync_synchronize() primitive provided by those
+older GCC versions.
+
+(Really, no __atomic or __sync operations are needed here at all, since POSIX
+4.12 "Memory Synchronization" says pthread_mutex_lock() and
+pthread_mutex_unlock() "synchronize memory with respect to other threads"...)
+
+Signed-off-by: Hollis Blanchard <hollis_blanchard at mentor.com>
+---
+ libselinux/src/label_file.h | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/libselinux/src/label_file.h b/libselinux/src/label_file.h
+index 2fa85474..47859baf 100644
+--- a/libselinux/src/label_file.h
++++ b/libselinux/src/label_file.h
+@@ -351,8 +351,14 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
+ 	 * init_routine does not take a parameter, it's not possible
+ 	 * to use, so we generate the same effect with atomics and a
+ 	 * mutex */
++#ifdef __ATOMIC_RELAXED
+ 	regex_compiled =
+ 		__atomic_load_n(&spec->regex_compiled, __ATOMIC_ACQUIRE);
++#else
++	/* GCC <4.7 */
++	__sync_synchronize();
++	regex_compiled = spec->regex_compiled;
++#endif
+ 	if (regex_compiled) {
+ 		return 0; /* already done */
+ 	}
+@@ -360,8 +366,14 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
+ 	__pthread_mutex_lock(&spec->regex_lock);
+ 	/* Check if another thread compiled the regex while we waited
+ 	 * on the mutex */
++#ifdef __ATOMIC_RELAXED
+ 	regex_compiled =
+ 		__atomic_load_n(&spec->regex_compiled, __ATOMIC_ACQUIRE);
++#else
++	/* GCC <4.7 */
++	__sync_synchronize();
++	regex_compiled = spec->regex_compiled;
++#endif
+ 	if (regex_compiled) {
+ 		__pthread_mutex_unlock(&spec->regex_lock);
+ 		return 0;
+@@ -404,7 +416,13 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
+ 	}
+ 
+ 	/* Done. */
++#ifdef __ATOMIC_RELAXED
+ 	__atomic_store_n(&spec->regex_compiled, true, __ATOMIC_RELEASE);
++#else
++	/* GCC <4.7 */
++	spec->regex_compiled = true;
++	__sync_synchronize();
++#endif
+ 	__pthread_mutex_unlock(&spec->regex_lock);
+ 	return 0;
+ }
+-- 
+2.13.0
+


More information about the buildroot mailing list