From 5adda72e1f941f2b53b853e4cebb77ba04d09bec Mon Sep 17 00:00:00 2001 From: Mikael Pettersson Date: Mon, 6 Jul 2020 12:12:19 +0200 Subject: [PATCH] ld: record a fragment's output offset separately from its input shdr --- erlang/apps/ld/src/ld_internal.hrl | 1 + erlang/apps/ld/src/ld_phase1.erl | 7 +++---- erlang/apps/ld/src/ld_symtab.erl | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/erlang/apps/ld/src/ld_internal.hrl b/erlang/apps/ld/src/ld_internal.hrl index 9172295..8206f40 100644 --- a/erlang/apps/ld/src/ld_internal.hrl +++ b/erlang/apps/ld/src/ld_internal.hrl @@ -35,6 +35,7 @@ , shdr :: #elf36_Shdr{} , shndx :: non_neg_integer() , relocs :: #elf36_Shdr{} | false + , offset :: non_neg_integer() % within enclosing #section{} }). -record(section, diff --git a/erlang/apps/ld/src/ld_phase1.erl b/erlang/apps/ld/src/ld_phase1.erl index 0a4ea68..d8cc73b 100644 --- a/erlang/apps/ld/src/ld_phase1.erl +++ b/erlang/apps/ld/src/ld_phase1.erl @@ -56,9 +56,9 @@ phase1(File, ShTab, StShNdx, OutputsMap) -> phase1([], _ShNdx, _File, _RelocsMap, OutputsMap) -> OutputsMap; -phase1([SHdr | ShTab], ShNdx, File, RelocsMap, OutputsMap) -> +phase1([Shdr | ShTab], ShNdx, File, RelocsMap, OutputsMap) -> NewOutputsMap = - maybe_output_section(SHdr, ShNdx, File, RelocsMap, OutputsMap), + maybe_output_section(Shdr, ShNdx, File, RelocsMap, OutputsMap), phase1(ShTab, ShNdx + 1, File, RelocsMap, NewOutputsMap). maybe_output_section(Shdr, ShNdx, File, RelocsMap, OutputsMap) -> @@ -99,8 +99,7 @@ output_append({Nr, OutputShdr, Frags}, File, Shdr, ShNdx, Relocs) -> NewOutputShdr = OutputShdr#elf36_Shdr{ sh_size = NewSize , sh_addralign = NewAlignment }, - NewShdr = Shdr#elf36_Shdr{sh_offset = FragOffset}, - Frag = #sectfrag{file = File, shdr = NewShdr, shndx = ShNdx, relocs = Relocs}, + Frag = #sectfrag{file = File, shdr = Shdr, shndx = ShNdx, relocs = Relocs, offset = FragOffset}, {Nr, NewOutputShdr, [Frag | Frags]}. section_alignment(Shdr) -> diff --git a/erlang/apps/ld/src/ld_symtab.erl b/erlang/apps/ld/src/ld_symtab.erl index 5b019af..242114e 100644 --- a/erlang/apps/ld/src/ld_symtab.erl +++ b/erlang/apps/ld/src/ld_symtab.erl @@ -50,8 +50,7 @@ scan_section(#section{shdr = Shdr, frags = Frags}, FragMap0, SegmentBase) -> scan_frag(Frag, FragMap, SectionBase) end, FragMap0, Frags). -scan_frag(#sectfrag{file = File, shdr = Shdr, shndx = ShNdx}, FragMap, SectionBase) -> - #elf36_Shdr{sh_offset = SectionOffset} = Shdr, +scan_frag(#sectfrag{file = File, shndx = ShNdx, offset = SectionOffset}, FragMap, SectionBase) -> maps:put({File, ShNdx}, SectionBase + SectionOffset, FragMap). %% Scan all input files, whose segments now have load addresses in FragMap,