Re: Anonymous namespaces and global vs.local symbols in nm output

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2020-11-24 19:02 +0000, Kacvinsky, Tom via Gcc-help 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++ -Wl,-
> h,global.so -fuse-ld=gold global_noans.cpp
> 
> produces this nm output
> 
> 0000000000082745 T
> _ZN3foo3barERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorI
> hSaIhEERSi
> 
> 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++ -Wl,-
> h,global.so -fuse-ld=gold global.cpp
> 
> produces this nm output
> 
> 00000000000826b5 t
> _ZN3foo12_GLOBAL__N_13barERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcE
> EERKSt6vectorIhSaIhEERSi
> 
> 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.  I have pinged the binutils list and they said
> this might be a g++ version issue (I am using GCC 8.3.0 with binutils 2.34,
> gold linker).  If this is a g++ issues, I am assuming the issue
> is anonymous name spaces make the symbol local, but if that isn't the cause,
> I'll got back to the binutils folks.  I am also going to try
> a later version of GCC and binutils.

The standard says ([basic.link] p4):

> An unnamed namespace or a namespace declared directly or indirectly within an
> unnamed namespace has internal linkage. All other namespaces have external
> linkage. A name having namespace scope that has not been given internal
> linkage above has the same linkage as the enclosing namespace if it is the
> name of
> (4.1) a variable; or
> (4.2) a function; or
> ...
-- 
Xi Ruoyao <xry111@xxxxxxxxxxxxxxxx>
School of Aerospace Science and Technology, Xidian University




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux