Anonymous namespaces and global vs.local symbols in nm output

Kacvinsky, Tom Tom.Kacvinsky@vector.com
Wed Nov 25 01:28:30 GMT 2020


HI,

> -----Original Message-----
> From: Jonathan Wakely <jwakely.gcc@gmail.com>
> Sent: Tuesday, November 24, 2020 3:03 PM
> To: Kacvinsky, Tom <Tom.Kacvinsky@vector.com>
> Cc: gcc-help@gcc.gnu.org
> Subject: Re: Anonymous namespaces and global vs.local symbols in nm
> output
> 
> On Tue, 24 Nov 2020 at 19:11, Kacvinsky, Tom via Gcc-help <gcc-
> help@gcc.gnu.org> wrote:
> >
> > This code
> >
> > #include <string>
> > #include <istream>
> > #include <iostream>
> > #include <vector>
> >
> > typedef std::vector<unsigned char> Signature;
> >
> > namespace foo {
> >   bool bar (const std::string& input,
> >             const Signature& signature,
> >             std::istream& key)
> >   {
> >     return true;
> >   }
> > }
> >
> > when compiled with
> >
> > g++ -fPIC -o global_noans.so -shared -static-libgcc -static-libstdc++
> > g++ -Wl,-h,global.so -fuse-ld=gold global_noans.cpp
> >
> > produces this nm output
> >
> > 0000000000082745 T
> > _ZN3foo3barERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt
> > 6vectorIhSaIhEERSi
> >
> > Notice how it is a global symbol?
> >
> > On the other hand, this code#include <string> #include <istream>
> > #include <iostream> #include <vector>
> >
> > typedef std::vector<unsigned char> Signature;
> >
> > namespace foo {
> >   namespace {
> >     bool bar(const std::string& input,
> >              const Signature& signature,
> >              std::istream& key)
> >     {
> >       return true;
> >     }
> >   }
> > }
> >
> > when compiled with
> >
> > g++ -fPIC -o global.so -shared -static-libgcc -static-libstdc++
> > g++ -Wl,-h,global.so -fuse-ld=gold global.cpp
> >
> > produces this nm output
> >
> > 00000000000826b5 t
> >
> _ZN3foo12_GLOBAL__N_13barERKNSt7__cxx1112basic_stringIcSt11char_trai
> ts
> > IcESaIcEEERKSt6vectorIhSaIhEERSi
> >
> > And now we note the symbolis local.  I tried building the shared
> > library with a -Wl,--version-script=global.map, where global.map is
> > set up to make the symbol glocal instead of local, and that did not
> > work.  I also tried compiling the source code with
> >
> > void __attribute__ ((visibility ("default")))
> >
> > but that made no difference, either, in the anonymous namespace symbol
> being lobal.
> 
> Why do you want to change it? G++ is doing the right thing.
> 
> What are you trying to achieve?

I am not trying to change it, I was more curious than anything as to why what I thought should be
external linkage turned out to be internal linkage.  The reason why I was surprised it was internal
linkage is I thought that we could do some internal testing with an LD_PRELOAD trick, but that did
not take because the symbol in  question is internal linkage.  Which is actually a good thing, it was
the kind of behavior we want.  Again, it was more curiosity than anything.

Thanks for your time responding!

Thanks,

Tom


More information about the Gcc-help mailing list