[Bug c/23058] New: visibility attribute does not work for aliased symbols

bruno at clisp dot org gcc-bugzilla@gcc.gnu.org
Mon Jul 25 11:53:00 GMT 2005


When a function or variable has its assembler name given through an 
__asm__, the __attribute__((__visibility__("default"))) present on the 
same declaration is ignored. 
 
$ gcc -v 
Using built-in specs. 
Target: i686-pc-linux-gnu 
Configured with: /freebsd/gnu/linuxarchive/gcc-4.0.1/configure 
--prefix=/packages/gnu-inst-gcc/4.0.1 --enable-shared 
--enable-version-specific-runtime-libs --enable-nls --enable-threads=posix 
--enable-__cxa_atexit --with-as=/packages/gnu/bin/as 
--with-ld=/packages/gnu/bin/ld 
Thread model: posix 
gcc version 4.0.1 
$ cat bug.c 
extern 
       int hidden_var 
       __asm__("my_hidden_var"); 
extern __attribute__((__visibility__("default"))) 
       int exported_var 
       __asm__("my_exported_var"); 
extern 
       int hidden_func (void) 
       __asm__("my_hidden_func"); 
extern __attribute__((__visibility__("default"))) 
       int exported_func (void) 
       __asm__("my_exported_func"); 
int my_hidden_var = 0; 
int my_exported_var = 0; 
int my_hidden_func (void) { return 0; } 
int my_exported_func (void) { return 0; } 
$ gcc -c -fvisibility=hidden bug.c 
$ readelf --syms bug.o 
 
Symbol table '.symtab' contains 11 entries: 
   Num:    Value  Size Type    Bind   Vis      Ndx Name 
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND  
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS bug.c 
     2: 00000000     0 SECTION LOCAL  DEFAULT    1  
     3: 00000000     0 SECTION LOCAL  DEFAULT    2  
     4: 00000000     0 SECTION LOCAL  DEFAULT    3  
     5: 00000000     0 SECTION LOCAL  DEFAULT    5  
     6: 00000000     0 SECTION LOCAL  DEFAULT    4  
     7: 00000000     4 OBJECT  GLOBAL HIDDEN    3 my_hidden_var 
     8: 00000004     4 OBJECT  GLOBAL HIDDEN    3 my_exported_var 
     9: 00000000    10 FUNC    GLOBAL HIDDEN    1 my_hidden_func 
    10: 0000000a    10 FUNC    GLOBAL HIDDEN    1 my_exported_func 
$ gcc -shared -o bug.so bug.o && nm bug.so | grep my_ 
00000476 t my_exported_func 
000015e4 b my_exported_var 
0000046c t my_hidden_func 
000015e0 b my_hidden_var 
 
As you can see, the symbols my_exported_func, my_exported_var are not 
exported from bug.so, because their visibility was "HIDDEN" in bug.o. 
 
Known workaround: If I write "int exported_var = 0;" instead of 
"int my_exported_var = 0;", and "int exported_func (void) { return 0; }" 
instead of ""int my_exported_func (void) { return 0; }", the problem 
disappears.

-- 
           Summary: visibility attribute does not work for aliased symbols
           Product: gcc
           Version: 4.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: bruno at clisp dot org
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23058



More information about the Gcc-bugs mailing list