Message ID | 20161106163236.GX27313@waldemar-brodkorb.de |
---|---|
State | New |
Headers | show |
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
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
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 --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; }