[PATCH] D71118: [llvm-readelf/llvm-readobj] - Improved the error reporting in a few method related to versioning.

James Henderson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 9 04:01:32 PST 2019


jhenderson added inline comments.


================
Comment at: llvm/tools/llvm-readobj/ELFDumper.cpp:4136
+        this->dumper()->getSymbolVersionByIndex(Ndx, IsDefault);
+    if (!NameOrErr || NameOrErr->empty()) {
+      if (!NameOrErr) {
----------------
grimar wrote:
> jhenderson wrote:
> > I'm not sure it's right to say that an empty name is corrupt?
> That what original code did (the test was introduced in D59877) and I think it is
> probably reasonable to assume that.
> Normally we probably never want to have an empty version name for a symbol that has version?
> Having such an empty version intentionally seems looks highly unlikely.
> 
> Spec says: "All other values are used to identify version strings located in one of the other Symbol
> Version sections. The value itself is not the version associated with the symbol.
> The string identified by the value defines the version of the symbol."
> (https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA.junk/symversion.html)
> It says nothing about the case when the version string is empty, though
> it sounds like it is assumed that a version exists, i.e is non-empty?
> 
> it is also just a bit strange to me to see the output for such case (below is what GNU readelf prints):
> 
> ```
> Symbol table '.dynsym' contains 6 entries:
>    Num:    Value          Size Type    Bind   Vis      Ndx Name
>      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
> ....
>      2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@ (2)
> ....
> Version symbols section '.gnu.version' contains 6 entries:
>  Addr: 000000000000043e  Offset: 0x00043e  Link: 5 (.dynsym)
>   000:   0 (*local*)       0 (*local*)       2 ()              0 (*local*)    
>   004:   0 (*local*)       2 () 
> ```
> 
> It looks like something is just wrong with the symbol `__libc_start_main@` and version 2?
But shouldn't we just allow it? It simplifies the code and brings us closer to GNU compatibility. Whilst I think it a bit odd, I don't see a strong motivation for handling the empty string differently to other strings. I don't feel strongly about this however.


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

https://reviews.llvm.org/D71118





More information about the llvm-commits mailing list