On Friday, 16 January 2015 at 04:31:17 UTC, Mike wrote:
On Thursday, 15 January 2015 at 12:01:05 UTC, Johannes Pfau
wrote:
My best guess is that the strings are always placed in rodata,
never in
separate sections. If you do write("x"), "x" is also in
rodata, the
rodata section can't be removed. If you delete the write call
there's
no reference to rodata and it's possible to remove the complete
section.
After some google-fu:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=192
Considering this was filed in 2000 I'd say it's not very
likely to get
fixed soon :-(
So the best option is probably to get rid of this problem by
patching
the compiler (@notypeinfo or -fnortti).
Here's a filthy sed hack to workaround this bug:
1) compile to assembly:
-----------------------------------------------
gdc -S -static -frelease -fno-emit-moduleinfo -nophoboslib
-nostdlib test.d --entry=main -ffunction-sections
-fdata-sections -Wl,--gc-sections -o test_temp.s
2) use sed to modify the assembly, putting each
string into its own section:
-----------------------------------------------
sed -e 's/^\(\.LC[0-9]*\)\(\:\)/\.section .rodata\1\n\1\2/g'
test_temp.s >test.s
3) compile the new assembly:
-----------------------------------------------
as test.s -o test.o
4) link:
-----------------------------------------------
ld test.o --entry=main --gc-sections -o test
5) verify:
-----------------------------------------------
objdump -s -j .rodata test
Contents of section .rodata:
400168 780a x.
size test
text data bss dec hex filename
338 0 0 338 152 test
6) execute:
------------------------------------------------
./test
x
Filthy, but cheap and effective. Fortunately it's all
automated with rdmd.
Mike
Looks like awesome wiki material :)