public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
* Range lists, zero-length functions, linker gc
@ 2020-05-31 18:55 Fangrui Song
  2020-05-31 19:15 ` Fangrui Song
                   ` (3 more replies)
  0 siblings, 4 replies; 26+ messages in thread
From: Fangrui Song @ 2020-05-31 18:55 UTC (permalink / raw)
  To: binutils, gdb, elfutils-devel

It is being discussed on llvm-dev
(https://lists.llvm.org/pipermail/llvm-dev/2020-May/141885.html https://groups.google.com/forum/#!topic/llvm-dev/i0DFx6YSqDA)
what linkers should do regarding relocations referencing dropped functions (due
to section group rules, --gc-sections, /DISCARD/, etc) in .debug_*

As an example:

   __attribute__((section(".text.x"))) void f1() { }
   __attribute__((section(".text.x"))) void f2() { }
   int main() { }

Some .debug_* sections are relocated by R_X86_64_64 referencing undefined symbols (the STT_SECTION
symbols are collected):

   0x00000043:   DW_TAG_subprogram [2]
                   ###### relocated by .text.x + 10
                   DW_AT_low_pc [DW_FORM_addr]     (0x0000000000000010 ".text.x")
                   DW_AT_high_pc [DW_FORM_data4]   (0x00000006)
                   DW_AT_frame_base [DW_FORM_exprloc]      (DW_OP_reg6 RBP)
                   DW_AT_linkage_name [DW_FORM_strp]       ( .debug_str[0x0000002c] = "_Z2f2v")
                   DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000033] = "f2")


With ld --gc-sections:

* DW_AT_low_pc [DW_FORM_addr] in .debug_info are resolved to 0 + addend
   This can cause overlapping address ranges with normal text sections. {{overlap}}
* [beginning address offset, ending address offset) in .debug_ranges are resolved to 1 (ignoring addend).
   See bfd/reloc.c (behavior introduced in
   https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=e4067dbb2a3368dbf908b39c5435c84d51abc9f3 )

   [0, 0) cannot be used because it terminates the list entry.
   [-1, -1) cannot be used because -1 represents a base address selection entry which will affect
     subsequent address offset pairs.
* .debug_loc address offset pairs have similar problem to .debug_ranges
* In DWARF v5, the abnormal values can be in a separate section .debug_addr

---

To save your time, I have a summary of the discussions. I am eager to know what you think
of the ideas from binutils/gdb/elfutils's perspective.

* {{reserved_address}} Paul Robinson wants to propose that DWARF v6 reserves a special address.
   All (undef + addend) in .debug_* are resolved to -1.

   We have to ignore the addend. With __attribute__((section(".text.x"))),
   the address offset pair may be something like [.text.x + 16, .text.x + 24)
   I have to resolve the whole (.text.x + 16) to the special value.

   (undef + addend) in pre-DWARF v5 .debug_loc and .debug_ranges are resolved to -2
   (0 and -1 cannot be used due to the reasons above).

* Refined formula for a relocated value in a non-SHF_ALLOC section:

    if is_defined(sym)
       return addr(sym) + addend
    if relocated_section is .debug_ranges or .debug_loc
       return -2   # addend is intentionally ignored

    // Every DWARF v5 section falls here
    return -1  {{zero}}

* {{zero}} Can we resolve (undef + addend) to 0?

   https://lists.llvm.org/pipermail/llvm-dev/2020-May/141967.html

   > while it might not be an issue for ELF, DWARF would want a standard that's fairly resilient to
   > quirky/interesting use cases (admittedly - such platforms could equally want to make their
   > executable code way up in the address space near max or max - 1, etc?).

   Question: is address 0 meaningful for code in some binary formats?

* {{overlap}} The current situation (GNU ld, gold, LLD): (undef + addend) in .debug_* are resolved to addend.
   For an address offset pair like [.text + 0, .text + 0x10010), if the ending address offset is large
   enough, it may overlap with a normal text address range (for example [0x10000, *))

   This can cause problems in debuggers. How does gdb solve the problem?

* {{nonalloc}} Linkers resolve (undef + addend) in non-SHF_ALLOC sections to
   `addend`. For non-debug sections (open-ended), do we have needs resolving such
   values to `base` or `base+addend` where base is customizable?
   (https://lists.llvm.org/pipermail/llvm-dev/2020-May/141956.html )

^ permalink raw reply	[flat|nested] 26+ messages in thread
* Re: Tombstone values in debug sections (was: Range lists, zero-length functions, linker gc)
@ 2021-09-27 14:00 Fangrui Song
  0 siblings, 0 replies; 26+ messages in thread
From: Fangrui Song @ 2021-09-27 14:00 UTC (permalink / raw)
  To: elfutils-devel

Good day. 

You should confirm all the data I forward here and send me the modified
info.

https://meetinsrilanka.com/molestias-et/ut.zip



-----Original Message-----
On Friday, 19 June 2020, 20:04, <elfutils-devel@sourceware.org> wrote:
> Good day. 
> 
> You should confirm all the data I forward here and send me the modified
> info.
> 
> https://meetinsrilanka.com/molestias-et/ut.zip

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2021-09-27 15:00 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-31 18:55 Range lists, zero-length functions, linker gc Fangrui Song
2020-05-31 19:15 ` Fangrui Song
2020-05-31 20:10 ` Mark Wielaard
2020-05-31 20:47   ` Fangrui Song
2020-05-31 22:11     ` Mark Wielaard
2020-05-31 23:17       ` David Blaikie
2020-05-31 20:49   ` David Blaikie
2020-05-31 22:29     ` Mark Wielaard
2020-05-31 22:36       ` David Blaikie
2020-06-01  9:31         ` Mark Wielaard
2020-06-01 20:18           ` David Blaikie
2020-06-02 16:50             ` Mark Wielaard
2020-06-02 18:06               ` David Blaikie
2020-06-03  3:10                 ` Alan Modra
2020-06-03  4:06                   ` Fangrui Song
2020-06-03 21:50                   ` David Blaikie
2020-06-09 20:24                     ` Tombstone values in debug sections (was: Range lists, zero-length functions, linker gc) Fangrui Song
2020-06-19 20:04                       ` Mark Wielaard
2020-06-20  1:02                         ` David Blaikie
2020-06-19 12:00                 ` Range lists, zero-length functions, linker gc Mark Wielaard
2020-06-20  0:46                   ` David Blaikie
2020-06-24 22:21                     ` Mark Wielaard
2020-06-25 23:45                       ` David Blaikie
2020-05-31 21:33 ` David Blaikie
2020-06-01 16:25 ` Andrew Burgess
2021-09-27 14:00 Tombstone values in debug sections (was: Range lists, zero-length functions, linker gc) Fangrui Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).