[Lldb-commits] [PATCH] D62213: [ABI] Implement Windows ABI for x86_64

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Jun 18 23:37:40 PDT 2019


labath added a comment.

In D62213#1549190 <https://reviews.llvm.org/D62213#1549190>, @kusmour wrote:

> > Maybe we should make the SysV abi plugin match unknown oss too...
>
> I'm not sure this is the right thing to do, but this should fix the problem.


It would at least preserve status quo. Not much, but it is something...

>> The only format where we have trouble determining the OS is ELF, and it's a pretty good bet that any elf file will be using the "SysV" ABI...
> 
> Can you provide more information about this? It sounds like a bug

Well.. you could consider it a bug, but it's quite hard to say where that bug is (it's definitely not a bug in lldb or llvm-mc). A sad fact of life is that the ELF files don't usually carry enough information to properly identify the os/environment they were intended to run on. If you run `readelf -e` on the file generated in the test, you'll get something like

  ELF Header:
    Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:                             ELF64
    Data:                              2's complement, little endian
    Version:                           1 (current)
    OS/ABI:                            UNIX - System V
    ABI Version:                       0
    Type:                              REL (Relocatable file)
    Machine:                           Advanced Micro Devices X86-64
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          0 (bytes into file)
    Start of section headers:          648 (bytes into file)
    Flags:                             0x0
    Size of this header:               64 (bytes)
    Size of program headers:           0 (bytes)
    Number of program headers:         0
    Size of section headers:           64 (bytes)
    Number of section headers:         9
    Section header string table index: 1
  
  Section Headers:
    [Nr] Name              Type             Address           Offset
         Size              EntSize          Flags  Link  Info  Align
    [ 0]                   NULL             0000000000000000  00000000
         0000000000000000  0000000000000000           0     0     0
    [ 1] .strtab           STRTAB           0000000000000000  00000238
         000000000000004e  0000000000000000           0     0     1
    [ 2] .text             PROGBITS         0000000000000000  00000040
         0000000000000003  0000000000000000  AX       0     0     4
    [ 3] .debug_str        PROGBITS         0000000000000000  00000043
         000000000000001b  0000000000000001  MS       0     0     1
    [ 4] .debug_loc        PROGBITS         0000000000000000  0000005e
         0000000000000036  0000000000000000           0     0     1
    [ 5] .debug_abbrev     PROGBITS         0000000000000000  00000094
         000000000000002d  0000000000000000           0     0     1
    [ 6] .debug_info       PROGBITS         0000000000000000  000000c1
         000000000000003d  0000000000000000           0     0     1
    [ 7] .rela.debug_info  RELA             0000000000000000  00000190
         00000000000000a8  0000000000000018           8     6     8
    [ 8] .symtab           SYMTAB           0000000000000000  00000100
         0000000000000090  0000000000000018           1     6     8
  Key to Flags:
    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
    L (link order), O (extra OS processing required), G (group), T (TLS),
    C (compressed), x (unknown), o (OS specific), E (exclude),
    l (large), p (processor specific)
  
  There are no program headers in this file.

The elf header has this OS/ABI field which could be used to specify linux, but here it's just set to the generic "none" value (which gets printed as "unix sysv"). There is a value for ELFOSABI_LINUX/ELFOSABI_GNU, which could be used to say "linux", but it seems nobody uses it (I'm not sure what's the background there). I guess that usually wasn't a problem, because tools would just assume they are dealing with binaries for the host platform, but lldb has a strong desire to know what platform is a binary intended for without assuming anything about the environment it's being run it. That desire is understandable, but it kind of collides with reality. Over time, lldb has developed a bunch of heuristics to determine the right OS for a file, but these are just heuristics, and they fail on extremely simple files like the ones used in this test, because they have nothing to go on.


Repository:
  rLLDB LLDB

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

https://reviews.llvm.org/D62213





More information about the lldb-commits mailing list