Removing RTTI from binaries
Dicebot via D.gnu
d.gnu at puremagic.com
Fri Jan 16 04:34:42 PST 2015
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 :)
More information about the D.gnu
mailing list