diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2016-08-19 22:25:12 +0200 |
---|---|---|
committer | Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | 2016-08-20 11:47:46 +0200 |
commit | 0d8a05c38e58b4c9240e882e0184bc10ec4f6eb4 (patch) | |
tree | 8923ed096c55f2378bef1ed6bb6104624e6f74a3 /package/gcc/6.1.0/892-libgcc-mkmap-symver-support-skip_underscore.patch | |
parent | 548657513d3d935e74aed2cfbc6d56ba0804736d (diff) | |
download | buildroot-0d8a05c38e58b4c9240e882e0184bc10ec4f6eb4.tar.gz buildroot-0d8a05c38e58b4c9240e882e0184bc10ec4f6eb4.zip |
bfin: fix issues with internal toolchain, re-enable C++ support
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>
Diffstat (limited to 'package/gcc/6.1.0/892-libgcc-mkmap-symver-support-skip_underscore.patch')
-rw-r--r-- | package/gcc/6.1.0/892-libgcc-mkmap-symver-support-skip_underscore.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/package/gcc/6.1.0/892-libgcc-mkmap-symver-support-skip_underscore.patch b/package/gcc/6.1.0/892-libgcc-mkmap-symver-support-skip_underscore.patch new file mode 100644 index 0000000000..1f779ed6f4 --- /dev/null +++ b/package/gcc/6.1.0/892-libgcc-mkmap-symver-support-skip_underscore.patch @@ -0,0 +1,74 @@ +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 + |