[PATCH] D78927: [yaml2obj] - Introduce the "Offset" property for sections.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 30 06:47:38 PDT 2020
grimar added inline comments.
================
Comment at: llvm/lib/ObjectYAML/ELFEmitter.cpp:1027-1030
+ reportError("the 'Offset' value (0x" +
+ Twine::utohexstr((uint64_t)*Offset) +
+ ") is incompatible with the alignment requested (0x" +
+ Twine::utohexstr(Align) + ")");
----------------
jhenderson wrote:
> MaskRay wrote:
> > grimar wrote:
> > > jhenderson wrote:
> > > > Should we really be reporting this error? I could imagine people wanting to create broken ELFs with a section at a specific offset and an alignment that doesn't match up.
> > > >
> > > > (Also "requested alignment" is more correct - adjectives generally come before their nouns)
> > > I wasn't sure about this error, but using both "AddressAlign" and "Offset" in a YAML probably might lead to confusion:
> > >
> > > ```
> > > Sections:
> > > - Name: .bar
> > > Type: SHT_PROGBITS
> > > Size: 0x10
> > > Offset: 0x100
> > > AddressAlign: 0x1000
> > > ```
> > >
> > > Usually `AddressAlign` affects the offset. I.e. it is not a regular field that just sets a value.
> > > And so it might raise a question: should an `Offset` be aligned by `AddressAlign`? Or should we use the `Offset` given and just ignore `AddressAlign`s usual logic?
> > >
> > > I am not sure we want to silently allow this combination (when an alignment doesn't match up).
> > >
> > > Currently there is a way to achieve what you describe: it should be possible to use `Filler`(s) + `ShOffset` + `AddressAlign` to create any layout.
> > > Perhaps it is sufficient?
> > >
> > For SHT_NOBITS sections, sh_offset%sh_addralign!=0 is possible (sh_offset for SHT_NOBITS can generally be ignored). lld can create such output (`ELF/Writer.cpp:computeFileOffset`).
> > I am not sure we want to silently allow this combination (when an alignment doesn't match up).
>
> I'd probably suggest ignoring the alignment in this situation, since the Offset is more explicit - if I specified an Offset that was deliberately not aligned, I'd probably still expect it to get respected, and the alignment field just used to set the sh_addralign value.
>
> You could add a warning if you wanted, but since those aren't likely to be seen, I'm not sure how useful that is.
OK. Done.
================
Comment at: llvm/lib/ObjectYAML/ELFEmitter.cpp:303
Doc.Header.SHEntSize ? (uint16_t)*Doc.Header.SHEntSize : sizeof(Elf_Shdr);
- // Immediately following the ELF header and program headers.
- // Align the start of the section header and write the ELF header.
- uint64_t SHOff;
- CBA.getOSAndAlignedOffset(SHOff, sizeof(typename ELFT::uint));
+ // Align the start of the section header and write the ELF header right after
+ // the ELF header and program headers.
----------------
jhenderson wrote:
> section header -> section header table (or section headers)
>
> The **ELF** header?
>
> I thought someone made a change a while back to write the section header table at the end anyway? Or am I getting mixed up with a different thing?
No, you are right, it is written to the end. I've broke this comment during rewriting somehow :/ Fixed.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D78927/new/
https://reviews.llvm.org/D78927
More information about the llvm-commits
mailing list