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

Bug#442918: marked as done (-fvisibility=hidden should not affect symbols declared with extern)



Your message dated Tue, 18 Sep 2007 09:51:24 +0200
with message-id <18159.33660.427503.507439@gargle.gargle.HOWL>
and subject line Bug#442918: -fvisibility=hidden should not affect symbols declared with extern
has caused the attached Bug report to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what I am
talking about this indicates a serious mail system misconfiguration
somewhere.  Please contact me immediately.)

Debian bug tracking system administrator
(administrator, Debian Bugs database)

--- Begin Message ---
Package: gcc
Version: 4:4.2.1-6
Severity: normal

--- Please enter the report below this line. ---

If I use -fvisibility=hidden, I expect symbols declared with "extern"
not be affected by it, as per the manpage (gcc-4.2 in gcc-4.2-doc).

"extern declarations are not affected by -fvisibility, so a lot of
code can be recompiled with -fvisibility=hidden with no modifications"

Yet a very simple testcase shows that even symbols marked extern are affected.
Tested with gcc-4.2, and gcc-4.1.

$ cat dso.c
extern int symbol(int x);
extern int symbol(int x)
{
}

$ gcc -fPIC -DPIC -fvisibility=hidden -shared dso.c -o dso.so &&
readelf -a dso.so | grep symbol
    49: 00000000000004cc     9 FUNC    LOCAL  HIDDEN   11 symbol

If I link an application that uses that symbol, the link will fail,
since the symbol is local and hidden.

Adding __attribute__((visibility("default"))) works as expected
(producing a DEFAULT symbol).

Either the manpage, or the behaviour should be changed.

Fixing the manpage is for sure the easiest way, but affecting externs
symbols by visibility=hidden is nonsense, since those are suppposed to
be the API functions that you "export".

Its the only (standard) way I can mark a functions as a globally
visible API. Also programs using symbols declared as extern expect
(and for good reason) to be able to successfully link with a DSO
containing that symbol.

Alternatives described at http://gcc.gnu.org/wiki/Visibility work of
course, but they require code changes. Not at all the "recompile with
no modifications" advertised by the manpage.
I should have another
-fvisibility-hidden-make-extern-behave-the-way-its-supposed-to-be flag
if the behaviour for "extern" and -fvisibility=hidden is to stay the
same.

But if this is to be fixed in the behaviour, then it should be
backported to gcc-4.1 too IMHO.


--- System information. ---
Architecture: amd64
Kernel:       Linux 2.6.23-rc6-hrt1-gc87ce658-dirty

Debian Release: lenny/sid
  500 unstable        www.debian-multimedia.org
  500 unstable        ftp.iasi.roedu.net
  500 testing         ftp.iasi.roedu.net
  500 feisty          wine.budgetdedicated.com
  500 etch            debian.beryl-project.org
    1 experimental    ftp.iasi.roedu.net

--- Package information. ---
Depends           (Version) | Installed
===========================-+-===============
cpp          (>= 4:4.2.1-6) | 4:4.2.1-6
gcc-4.2        (>= 4.2.1-3) | 4.2.1-5



--- End Message ---
--- Begin Message ---
=?UTF-8?Q? "T=C3=B6r=C3=B6k?= Edvin" writes:
> Package: gcc
> Version: 4:4.2.1-6
> Severity: normal
> 
> --- Please enter the report below this line. ---
> 
> If I use -fvisibility=hidden, I expect symbols declared with "extern"
> not be affected by it, as per the manpage (gcc-4.2 in gcc-4.2-doc).
> 
> "extern declarations are not affected by -fvisibility, so a lot of
> code can be recompiled with -fvisibility=hidden with no modifications"
> 
> Yet a very simple testcase shows that even symbols marked extern are affected.
> Tested with gcc-4.2, and gcc-4.1.
> 
> $ cat dso.c
> extern int symbol(int x);
> extern int symbol(int x)
> {
> }

both the man page and the compiler are correct; remove the definition
of `symbol'.

extern int symbol(int x);
static int foo(int x) { return symbol(x); }

$ gcc -fPIC -DPIC -fvisibility=hidden -shared dso.c -o dso.so &&
readelf -a dso.so | grep symbol
     5: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND symbol
    55: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND symbol


--- End Message ---

Reply to: