From 075c025999608615c095a7d047be8415875b81e8 Mon Sep 17 00:00:00 2001 From: Spydr <58859306+Spydr06@users.noreply.github.com> Date: Wed, 2 Nov 2022 14:48:25 +0100 Subject: [PATCH] native: don't generate duplicate strings (#16281) --- vlib/v/gen/native/elf.v | 15 +++++++++++---- vlib/v/gen/native/macho.v | 18 +++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/vlib/v/gen/native/elf.v b/vlib/v/gen/native/elf.v index d5775124ac..be85a920fb 100644 --- a/vlib/v/gen/native/elf.v +++ b/vlib/v/gen/native/elf.v @@ -823,20 +823,27 @@ pub fn (mut g Gen) generate_simple_elf_header() { } pub fn (mut g Gen) elf_string_table() { + mut generated := map[string]int{} + for _, s in g.strs { + pos := generated[s.str] or { g.buf.len } + match s.typ { .abs64 { - // g.write64_at(native.segment_start + g.buf.len, int(g.str_pos[i])) - g.write64_at(s.pos, g.buf.len) + g.write64_at(s.pos, pos) } .rel32 { - g.write32_at(s.pos, g.buf.len - s.pos - 4) + g.write32_at(s.pos, pos - s.pos - 4) } else { g.n_error('unsupported string reloc type') } } - g.write_string(s.str) + + if s.str !in generated { + generated[s.str] = pos + g.write_string(s.str) + } } } diff --git a/vlib/v/gen/native/macho.v b/vlib/v/gen/native/macho.v index c4a3d68b36..862be4d200 100644 --- a/vlib/v/gen/native/macho.v +++ b/vlib/v/gen/native/macho.v @@ -478,22 +478,30 @@ fn (mut g Gen) write_symbol(s Symbol) { fn (mut g Gen) sym_string_table() int { begin := g.buf.len g.zeroes(1) + + mut generated := map[string]int{} + for _, s in g.strs { - pos := g.buf.len - s.pos - 4 + pos := generated[s.str] or { g.buf.len } + match s.typ { .rel32 { - g.write32_at(s.pos, pos) + g.write32_at(s.pos, pos - s.pos - 4) } else { if g.pref.os == .windows { // that should be .rel32, not windows-specific - g.write32_at(s.pos, pos) + g.write32_at(s.pos, pos - s.pos - 4) } else { - g.write64_at(s.pos, g.buf.len + native.base_addr) + g.write64_at(s.pos, pos + native.base_addr) } } } - g.write_string(s.str) + + if s.str !in generated { + generated[s.str] = pos + g.write_string(s.str) + } } return g.buf.len - begin }