[PATCH] D78927: [yaml2obj] - Introduce the "Offset" property for sections.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 15 03:02:41 PDT 2020


grimar marked an inline comment as done.
grimar added inline comments.


================
Comment at: llvm/lib/ObjectYAML/ELFEmitter.cpp:48
-    return OS;
-  }
 
----------------
grimar wrote:
> FTR, after commiting this patch I faced LLD test failture and fixed it:
> https://github.com/llvm/llvm-project/commit/969c63a2ecfb536062ff2174645abe31e4036067
> (it started to report "section [index 1] has a sh_offset (0x1000000000000000) + sh_size (0x4) that is greater than the file size (0x100000120)" instead of "section sh_addralign is too large" LLD's error)
> 
> The issue was related to "AddressAlign:    0x1000000000000000" line in the YAML:
> 
> ```
>   - Name:            .text
>     Type:            SHT_PROGBITS
>     Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
>     AddressAlign:    0x1000000000000000
>     Content:         "00000000"
> ```
> 
> 
> Previously, we had this piece of code which used `unsigned`, so `AddressAlign` was truncated.
> As a result a little binary with `sh_addrallign==0x1000000000000000` was produced.
> After this patch, this piece does not exist and currently for that test a 500mb binary with with `sh_addrallign==0x1000000000000000` is produced. I.e. it works a bit more correct, but
> the binary is is still truncated.
> 
> It happens because of `ELFState<ELFT>::alignToOffset`, which has the following lines:
> 
> ```
>   CBA.getOS().write_zeros(AlignedOffset - CurrentOffset);
>   return AlignedOffset;
> ```
> 
> `AlignedOffset`  and `CurrectOffset` are `uint64_t`, but `raw_ostream::write_zeros` takes `unsigned`:
> 
> ```
> /// indent - Insert 'NumSpaces' spaces.
> raw_ostream &raw_ostream::indent(unsigned NumSpaces) {
>   return write_padding<' '>(*this, NumSpaces);
> }
> 
> /// write_zeros - Insert 'NumZeros' nulls.
> raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
>   return write_padding<'\0'>(*this, NumZeros);
> }
> ```
> 
> Probably we want to change it to take `uint64_t`.
> I do not think there is a way to write a test for it though as the result output would be huge.
Ind I do not believe someone really needs `uint64_t` there to put so many zeroes, so I am not sure if we want to change it for "correctness" or not.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D78927/new/

https://reviews.llvm.org/D78927





More information about the llvm-commits mailing list