Bug 7083 – variables with static/private storage create global symbols
Status
RESOLVED
Resolution
WONTFIX
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
FreeBSD
Creation time
2011-12-08T17:28:27Z
Last change time
2022-03-03T15:43:53Z
Assigned to
No Owner
Creator
Martin Nowak
Comments
Comment #0 by code — 2011-12-08T17:28:27Z
----
module bug;
static
{
__gshared int sa;
extern(C) __gshared int sb;
}
private
{
__gshared int pa;
extern(C) __gshared int pb;
}
----
dmd -c bug.d
nm -c bug.o
output:
0000000000000008 B _D3bug2pai
0000000000000000 B _D3bug2sai
000000000000000c B pb
0000000000000004 B sb
expected output:
0000000000000008 b _D3bug2pai
0000000000000000 b _D3bug2sai
000000000000000c b pb
0000000000000004 b sb
----------------
Either static or private should provide the C's static semantic
of defining a local symbol, i.e. one that can only be accessed
from within the same object file. Probably only useful for
extern(C) as D declarations are scoped by the mangling but
for D it would still shrink the symbol table.
Comment #1 by bugzilla — 2011-12-08T20:56:19Z
This is done deliberately as the code/data for one module can be distributed among several object files (unlike C) and the only way they can communicate is via a global name.
Comment #2 by code — 2013-03-27T13:07:58Z
It would be good to reconsider this for PIC code where every access to global symbols is indirect through the GOT table.
> as the code/data for one module can be distributed among several object files
Do you mean the multilib support?
Comment #3 by code — 2013-04-03T19:55:13Z
(In reply to comment #2)
> It would be good to reconsider this for PIC code where every access to global
> symbols is indirect through the GOT table.
>
This could be achieved by changing the default visibility to hidden.
Similar to Windows only symbols with the export attribute would be visible in a shared library thus allowing link-time optimizations for non-exported symbols.
http://gcc.gnu.org/wiki/Visibility
Comment #4 by kinke — 2022-03-03T15:43:53Z
(In reply to Martin Nowak from comment #2)
> > as the code/data for one module can be distributed among several object files
>
> Do you mean the multilib support?
```
private __gshared int something;
int getSomething(T)() { …; return something; }
```
If the (public) template is instantiated and emitted into another object file / binary, it still needs to be able to access the private symbol.