[Dwarf-Discuss] .debug_frame and the base address
I'd like some clarification regarding what precisely needs to be relocated relative to the object load address when interpreting .debug_frame. I'm interested in versions 2, 3 and 4. I think the only explicit mention of relocation in DWARF 4 is § 6.4.1: Abstractly, this mechanism describes a very large table... ... The first column indicates an address for every location that contains code in a program. (In shared objects, this is an object-relative offset.) Thus adjustments need to be made to only An FDE's initial_location field DW_CFA_set_loc's operand Have I missed anything? I see some ambiguity in the definition of DW_CFA_def_cfa_expression and it's making me wonder if there are any other occasions when a result would require relocation. Robert Harris ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] .debug_frame and the base address
> On 24 Sep 2018, at 15:33, Greg Clayton wrote: > > > >> On Sep 24, 2018, at 7:15 AM, Robert Harris via Dwarf-Discuss >> wrote: >> >> I'd like some clarification regarding what precisely needs to be relocated >> relative to >> the object load address when interpreting .debug_frame. I'm interested in >> versions >> 2, 3 and 4. >> >> I think the only explicit mention of relocation in DWARF 4 is § 6.4.1: >> >> Abstractly, this mechanism describes a very large table... >> ... >> The first column indicates an address for every location that contains >> code in a program. (In shared objects, this is an object-relative >> offset.) >> >> Thus adjustments need to be made to only >> >> An FDE's initial_location field >> DW_CFA_set_loc's operand >> >> Have I missed anything? I see some ambiguity in the definition of >> DW_CFA_def_cfa_expression and it's making me wonder if there are any >> other occasions when a result would require relocation. > > Any DWARF expression can contain a DW_OP_addr, which has an address argument, > and would need to be relocated. Do you mean that DW_OP_addr's argument should be relocated in all instances of a DWARF expression, i.e. in other .debug_ sections, or just in the context of .debug_frame? ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] .debug_frame and the base address
> On 24 Sep 2018, at 16:59, Greg Clayton wrote: > > > >> On Sep 24, 2018, at 8:44 AM, Robert Harris >> wrote: >> >> >> >>> On 24 Sep 2018, at 15:33, Greg Clayton wrote: >>> >>> >>> >>>> On Sep 24, 2018, at 7:15 AM, Robert Harris via Dwarf-Discuss >>>> wrote: >>>> >>>> I'd like some clarification regarding what precisely needs to be relocated >>>> relative to >>>> the object load address when interpreting .debug_frame. I'm interested in >>>> versions >>>> 2, 3 and 4. >>>> >>>> I think the only explicit mention of relocation in DWARF 4 is § 6.4.1: >>>> >>>>Abstractly, this mechanism describes a very large table... >>>>... >>>>The first column indicates an address for every location that contains >>>>code in a program. (In shared objects, this is an object-relative >>>> offset.) >>>> >>>> Thus adjustments need to be made to only >>>> >>>>An FDE's initial_location field >>>>DW_CFA_set_loc's operand >>>> >>>> Have I missed anything? I see some ambiguity in the definition of >>>> DW_CFA_def_cfa_expression and it's making me wonder if there are any >>>> other occasions when a result would require relocation. >>> >>> Any DWARF expression can contain a DW_OP_addr, which has an address >>> argument, and would need to be relocated. >> >> Do you mean that DW_OP_addr's argument should be relocated in all instances >> of a DWARF expression, i.e. in other .debug_ sections, or just in the >> context of >> .debug_frame? > > I was specifically talking about DWARF expressions in any .debug_frame info. Well, that would preclude relocating the *result* of any DWARF expression in .debug_frame. For some expressions, e.g. DW_CFA_expression, the use of the CFA to initialise the stack implies as much but this would be a useful blanket constraint. > But in general, yes, any DWARF expression that contains a DW_OP_addr might > need a relocation for its address argument. Are you aware of where in the standard this is documented? It sounds reasonable but I'm returning to this after a long time and I don't remember my way around as well as I used to. ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] .debug_frame and the base address
> On 24 Sep 2018, at 18:40, Eric Christopher wrote: > > Dwarf 5, 7.3.1 > > "A DWARF expression may contain a DW_OP_addr (see Section 2.5.1.1 on 31 page > 26) which contains a location within the virtual address space of the 32 > program, and require relocation." I think I've confused the issue by using the word relocation instead of the phrase "interpreted relative to the base address of the load object". I'm interested in the final state of an executable or shared object and I don't expect to find any remaining ELF-style (e.g. R_AMD64_64 and the like) run time (ld.so) relocations in non-loadable .debug_* sections. My question instead concerns things like initial_location in an FDE, which is interpreted relative to the base address of the enclosing load object. I can see that DW_CFA_set_loc's operand would also need to be interpreted as relative to the same base address. However, I'm trying to establish if there's anything else within .debug_frame that would be expressed relative to the same base address. For example, DW_CFA_expression assumes that the CFA is already on the stack and it would be perverse to expect the result to be anything other than an absolute address. But is the same true of DW_CFA_def_cfa_expressions? What about instructions within the expressions themselves... The DW_OP_addr case is confusing. As it's an object address its operand is highly likely to require an ELF-style (ld-style) relocation to produce an appropriate address in the linked object. However, I can see that in a shared object it would be plausible that the final, ELF-style relocated argument should additionally need to be interpreted as relative to the load object's base address. I assumed Greg was asserting the latter with: > On 24 Sep 2018, at 15:33, Greg Clayton wrote: > > Any DWARF expression can contain a DW_OP_addr, which has an address argument, > and would need to be relocated. and, not remembering any mention to the contrary in DWARF 2/3/4 wondered if this was really the case --- it would certainly have helped answer my actual concern about .debug_frame. However, the follow-up references to DWARF 5 7.3.1 and 2.5.1.1 are discussing ELF-style relocations, and are, unfortunately, red herrings. Robert ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] .debug_frame and the base address
> On 25 Sep 2018, at 01:44, Cary Coutant wrote: > > The new material in Section 7.3.1 about what needs relocation is > clarifying material that was just as true for DWARF 2, 3, and 4. That > was an attempt to pre-emptively answer your questions above. OK. Many thanks, all, for your clarifications and your patience. I'll digest them and the references. Robert ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org