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 :)

Reply via email to