[oi-dev] NS_COM_GLUE and upstream FF patches

Alexander Pyhalov alp at rsu.ru
Wed Dec 18 14:21:47 UTC 2013


Hello.
Does someone understand FF code (or libxpcom_glue usage) good enough to 
comment on the following?

in nscore.h we define NS_COM_GLUE:

#ifdef MOZILLA_INTERNAL_API
#  define NS_COM_GLUE
    /*
      The frozen string API has different definitions of nsAC?String
      classes than the internal API. On systems that explicitly declare
      dllexport symbols this is not a problem, but on ELF systems
      internal symbols can accidentally "shine through"; we rename the
      internal classes to avoid symbol conflicts.
    */
#  define nsAString nsAString_internal
#  define nsACString nsACString_internal
#else
#  ifdef HAVE_VISIBILITY_ATTRIBUTE
#    define NS_COM_GLUE NS_VISIBILITY_HIDDEN
#  else
#    define NS_COM_GLUE
#  endif
#endif

And later while linking libxul.so, we link it to libxpcomglue_s.a with 
"-z allextract" (as I understand - to make libxpcomglue_s.a symbols 
available in libxul.so):

-Wl,-z -Wl,allextract 
/export/home/alp/srcs/oi-userland/components/xulrunner/build/i86/dist/lib/libxpcomglue_s.a 
-Wl,-z -Wl,defaultextract

so, definition in nsCategoryCache.h:
class NS_COM_GLUE nsCategoryObserver MOZ_FINAL : public nsIObserver {
   public:
     nsCategoryObserver(const char* aCategory,
                        nsCategoryListener* aCategoryListener);
     ~nsCategoryObserver();

     void ListenerDied();

     NS_DECL_ISUPPORTS
     NS_DECL_NSIOBSERVER
   private:
     NS_HIDDEN_(void) RemoveObservers();

     nsDataHashtable<nsCStringHashKey, nsCString> mHash;
     nsCategoryListener*                          mListener;
     nsCString                                    mCategory;
     bool                                         mObserversRemoved;
};

causes this class to be hidden.
But it appears in object's headers
$ elfdump nsCategoryCache.o  |grep nsCategoryObserver

Section Header[37]:  sh_name: .data.rel.ro._ZTV18nsCategoryObserver
Section Header[38]:  sh_name: .rel.data.rel.ro._ZTV18nsCategoryObserver
        [5]  0x00000000 0x00000018  OBJT LOCL  D    0 .data.rel.ro 
_ZZN18nsCategoryObserver14QueryInterfaceERK4nsIDPPvE5table
       [48]  0x00000000 0x0000000e  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserver6AddRefEv
       [49]  0x00000010 0x00000031  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserver14QueryInterfaceERK4nsIDPPv
       [64]  0x00000050 0x000000d2  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserver15RemoveObserversEv
       [68]  0x00000130 0x00000010  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserver12ListenerDiedEv
       [69]  0x00000140 0x000003bd  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserver7ObserveEP11nsISupportsPKcPKt
       [87]  0x00000500 0x00000044  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserverD2Ev
       [88]  0x00000000 0x00000018  OBJT WEAK  H    0 .data.rel.ro._ 
_ZTV18nsCategoryObserver
       [89]  0x00000500 0x00000044  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserverD1Ev
       [90]  0x00000550 0x00000055  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserver7ReleaseEv
       [96]  0x000005b0 0x0000056e  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserverC2EPKcP18nsCategoryListener
      [103]  0x000005b0 0x0000056e  FUNC GLOB  H    0 .text 
_ZN18nsCategoryObserverC1EPKcP18nsCategoryListener
        [0]   [ COMDAT ]               _ZTV18nsCategoryObserver
        [1]   .data.rel.ro._ZTV18nsCategoryObserver [37]
   R_386_PC32                    0x450             .rel.text 
_ZN18nsCategoryObserver15RemoveObserversEv
   R_386_GOTOFF                  0x51c             .rel.text 
_ZTV18nsCategoryObserver
   R_386_PC32                    0x581             .rel.text 
_ZN18nsCategoryObserverD1Ev
   R_386_GOTOFF                  0x5d0             .rel.text 
_ZTV18nsCategoryObserver
   R_386_PC32                    0x13c             .rel.text 
_ZN18nsCategoryObserver15RemoveObserversEv
Relocation Section:  .rel.data.rel.ro._ZTV18nsCategoryObserver
   R_386_32                        0x8             .rel.data.rel. 
_ZN18nsCategoryObserver14QueryInterfaceERK4nsIDPPv
   R_386_32                        0xc             .rel.data.rel. 
_ZN18nsCategoryObserver6AddRefEv
   R_386_32                       0x10             .rel.data.rel. 
_ZN18nsCategoryObserver7ReleaseEv
   R_386_32                       0x14             .rel.data.rel. 
_ZN18nsCategoryObserver7ObserveEP11nsISupportsPKcPKt

And during linking this object is extracted from nsCategoryCache.o, this 
results in

ld: fatal: relocation error: R_386_GOTOFF: file 
../../dist/lib/libxpcomglue_s.a(nsCategoryCache.o): symbol vtable for 
nsCategoryObserver: a GOT relative relocation must reference a local symbol
ld: fatal: relocation error: R_386_GOTOFF: file 
../../dist/lib/libxpcomglue_s.a(nsCategoryCache.o): symbol vtable for 
nsCategoryObserver: a GOT relative relocation must reference a local symbol
collect2: error: ld returned 1 exit status
make[4]: *** [libxul.so] Error 1

The main question is how and why this works with Sun CC and doesn't work 
with GNU g++? What is the intention: to make all symbols public?  How 
this class nsCategoryObserver is used? Will defining it public do any harm?
-- 
Best regards,
Alexander Pyhalov,
system administrator of Computer Center of Southern Federal University



More information about the oi-dev mailing list