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