diff mbox

libgcc/mkmap-symver: support skip_underscore (PR74748)

Message ID 20161106163236.GX27313@waldemar-brodkorb.de
State New
Headers show

Commit Message

Waldemar Brodkorb Nov. 6, 2016, 4:32 p.m. UTC
Hi,

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>
Tested-by: Waldemar Brodkorb <wbx@openadk.org>

2016-11-06  Thomas Petazzoni <thomas.petazzoni@free-electrons.com>

	PR gcc/74748
	* libgcc/mkmap-symver.awk: add support for skip_underscore



Thanks in advance,
 Waldemar

Comments

Jeff Law Nov. 17, 2016, 9:08 p.m. UTC | #1
On 11/06/2016 09:32 AM, Waldemar Brodkorb wrote:
> Hi,
>
> 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>
> Tested-by: Waldemar Brodkorb <wbx@openadk.org>
>
> 2016-11-06  Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
>
> 	PR gcc/74748
> 	* libgcc/mkmap-symver.awk: add support for skip_underscore
AFAICT this skips the first character regardless of whether or not it is 
an underscore when skip_underscore is in effect, right.  Is that 
intentional?

Jeff
Thomas Petazzoni Nov. 19, 2016, 9:45 a.m. UTC | #2
Hello,

On Thu, 17 Nov 2016 14:08:34 -0700, Jeff Law wrote:

> AFAICT this skips the first character regardless of whether or not it is 
> an underscore when skip_underscore is in effect, right. 

Correct.

> Is that intentional?

All symbols in Blackfin are prepended with an underscore, so we're
pretty much guaranteed there is one, and we precisely want to get rid
of this prepended underscore. So I'd say it's good enough to get rid of
the first character, without checking if it's an underscore or not.

Of course, if you think we really want to be extra safe and only remove
it after making sure it's an underscore, I can probably improve the awk
logic to handle this.

Thanks for the feedback!

Thomas
Jeff Law Nov. 19, 2016, 7:33 p.m. UTC | #3
On 11/19/2016 02:45 AM, Thomas Petazzoni wrote:
> All symbols in Blackfin are prepended with an underscore, so we're
> pretty much guaranteed there is one, and we precisely want to get rid
> of this prepended underscore. So I'd say it's good enough to get rid of
> the first character, without checking if it's an underscore or not.
>
> Of course, if you think we really want to be extra safe and only remove
> it after making sure it's an underscore, I can probably improve the awk
> logic to handle this.
Let's be extra safe -- skip_underscore, in my  mind, implies that it's 
only going to skip an underscore.

Jeff
diff mbox

Patch

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