From 4eeae592935920370c75b83dff1883dbd980f20e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= <pedrojrulez@gmail.com>
Date: Thu, 16 Jan 2020 17:47:37 +0100
Subject: [PATCH] Fix error exporting to X11 with embedded PCK

Fixes #32513.
---
 platform/x11/detect.py           | 12 +++++++++---
 platform/x11/pck_embed.ld        |  4 ++--
 platform/x11/pck_embed.legacy.ld | 10 ++++++++++
 3 files changed, 21 insertions(+), 5 deletions(-)
 create mode 100644 platform/x11/pck_embed.legacy.ld

diff --git a/platform/x11/detect.py b/platform/x11/detect.py
index b8ff97279df..5c7be347309 100644
--- a/platform/x11/detect.py
+++ b/platform/x11/detect.py
@@ -171,7 +171,7 @@ def configure(env):
             else:
                 env.Append(CCFLAGS=['-flto'])
                 env.Append(LINKFLAGS=['-flto'])
-        
+
         if not env['use_llvm']:
             env['RANLIB'] = 'gcc-ranlib'
             env['AR'] = 'gcc-ar'
@@ -329,9 +329,15 @@ def configure(env):
 
     if env["execinfo"]:
         env.Append(LIBS=['execinfo'])
-        
+
     if not env['tools']:
-        env.Append(LINKFLAGS=['-T', 'platform/x11/pck_embed.ld'])
+        import subprocess
+        import re
+        binutils_version = re.search('\s(\d+\.\d+)', str(subprocess.check_output(['ld', '-v']))).group(1)
+        if float(binutils_version) >= 2.30:
+            env.Append(LINKFLAGS=['-T', 'platform/x11/pck_embed.ld'])
+        else:
+            env.Append(LINKFLAGS=['-T', 'platform/x11/pck_embed.legacy.ld'])
 
     ## Cross-compilation
 
diff --git a/platform/x11/pck_embed.ld b/platform/x11/pck_embed.ld
index fe09144d887..57a1994043b 100644
--- a/platform/x11/pck_embed.ld
+++ b/platform/x11/pck_embed.ld
@@ -1,9 +1,9 @@
 SECTIONS
 {
 	/* Add a zero-sized section; the exporter will patch it to enclose the data appended to the executable (embedded PCK) */
-	pck 0 (NOLOAD) :
+	pck 0 (INFO) :
 	{
-		/* Just some content to avoid the linker discarding the section */
+		/* binutils >= 2.30 allow it being zero-sized, but needs something between the braces to keep the section */
 		. = ALIGN(8);
 	}
 }
diff --git a/platform/x11/pck_embed.legacy.ld b/platform/x11/pck_embed.legacy.ld
new file mode 100644
index 00000000000..a23013ba7ae
--- /dev/null
+++ b/platform/x11/pck_embed.legacy.ld
@@ -0,0 +1,10 @@
+SECTIONS
+{
+	/* The exporter will patch this section to enclose the data appended to the executable (embedded PCK) */
+	pck 0 (INFO) : AT ( ADDR (.rodata) + SIZEOF (.rodata) )
+	{
+		/* binutils < 2.30 need some actual content for the linker not to discard the section */
+		BYTE(0);
+	}
+}
+INSERT AFTER .rodata;