0d8a05c38e
The three patches allow to compile applications using TLS emulation from libgcc or C++ applications. The patches 892-libgcc-mkmap-symver-support-skip_underscore.patch and 893-libgcc-config-bfin-use-the-generic-linker-version-in.patch fixes how libgcc is generated, by making the necessary libgcc symbols declared "GLOBAL", and therefore visible outside of libgcc. This fixes a large number of undefined reference issues (for either C++ applications or applications using TLS emulation). This was reported as gcc PR74748. The patch 894-libgcc-fix-DWARF-compilation-with-FDPIC-targets.patch allows to build DWARF in FDPIC mode. This patch replaces the older 892-disable-dwarf-bfin.patch, as instead of disabling DWARF support, it fixes it. This was reported as gcc PR68468. In order to get C++ working without unresolved symbols, we also need to disable symbol versioning (--disable-symvers). This is a remaining issue in gcc which will be investigated at a later point. Since this commit fixes C++ support in Blackfin, it re-enables the selection of C++ support for this architecture. Fixes: (alsa-lib emutls) http://autobuild.buildroot.net/results/8544ce58d75820666579db93a25ca5656a8efa8e/ (cairo emutls) http://autobuild.buildroot.net/results/88b02a5dd5408318941ccbfcea0a9cbaa331500a/ (audiofile c++) http://autobuild.buildroot.net/results/394e530c5dcd9ccb590eb151aeaadb37d11e0e39/ (assimp c++) http://autobuild.buildroot.net/results/01f4be126c2d786a5ad7f220c2cf60539888a480/ (bellagio c++) http://autobuild.buildroot.net/results/ada/ada44228bf13ec05382275bd6571396f5ba2b1f7/ Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> Tested-by: Waldemar Brodkorb <wbx@openadk.org> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
75 lines
2.6 KiB
Diff
75 lines
2.6 KiB
Diff
From ae9c3e354440c4a0f105a9eabfb2f77be085ebc1 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
Date: Thu, 18 Aug 2016 17:59:16 +0200
|
|
Subject: [PATCH] libgcc/mkmap-symver: support skip_underscore
|
|
|
|
Some platforms, such as Blackfin, have a special prefix for assembly
|
|
symbols as opposed to C symbols. For this reason, a function named
|
|
"foo()" in C will in fact be visible as a symbol called "_foo" in the
|
|
ELF binary.
|
|
|
|
The current linker version script logic in libgcc doesn't take into
|
|
account this situation properly. The Blackfin specific
|
|
libgcc/config/bfin/libgcc-glibc.ver has an additional "_" in front of
|
|
every symbol so that it matches the output of "nm" (which gets parsed to
|
|
produce the final linker version script). But due to this additional
|
|
"_", ld no longer matches with the symbols since "ld" does the matching
|
|
with the original symbol name, not the one prefixed with "_".
|
|
|
|
Due to this, none of the symbols in libgcc/config/bfin/libgcc-glibc.ver
|
|
are actually matched with symbols in libgcc. This causes all libgcc
|
|
symbols to be left as "LOCAL", which causes lots of "undefined
|
|
reference" whenever some C or C++ code that calls a function of libgcc
|
|
is compiled.
|
|
|
|
To address this, this commit introduces a "skip_underscore" variable to
|
|
the mkmap-symver script. It tells mkmap-symver to ignore the leading
|
|
underscore from the "nm" output.
|
|
|
|
Note that this new argument is different from the existing
|
|
"leading_underscore" argument, which *adds* an additional underscore to
|
|
the generated linker version script.
|
|
|
|
Having this functionality paves the way to using the generic linker
|
|
version information for Blackfin, instead of using a custom one.
|
|
|
|
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
---
|
|
libgcc/ChangeLog | 5 +++++
|
|
libgcc/mkmap-symver.awk | 6 +++++-
|
|
2 files changed, 10 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
|
|
index 6559564..129e43f 100644
|
|
--- a/libgcc/ChangeLog
|
|
+++ b/libgcc/ChangeLog
|
|
@@ -1,3 +1,8 @@
|
|
+2016-08-19 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
+
|
|
+ PR gcc/74748
|
|
+ * libgcc/mkmap-symver.awk: add support for skip_underscore
|
|
+
|
|
2016-04-27 Release Manager
|
|
|
|
* GCC 6.1.0 released.
|
|
diff --git a/libgcc/mkmap-symver.awk b/libgcc/mkmap-symver.awk
|
|
index 266832a..30bb179 100644
|
|
--- a/libgcc/mkmap-symver.awk
|
|
+++ b/libgcc/mkmap-symver.awk
|
|
@@ -47,7 +47,11 @@ state == "nm" && ($1 == "U" || $2 == "U") {
|
|
|
|
state == "nm" && NF == 3 {
|
|
split ($3, s, "@")
|
|
- def[s[1]] = 1;
|
|
+ if (skip_underscore)
|
|
+ symname = substr(s[1], 2);
|
|
+ else
|
|
+ symname = s[1];
|
|
+ def[symname] = 1;
|
|
sawsymbol = 1;
|
|
next;
|
|
}
|
|
--
|
|
2.7.4
|
|
|