Commit 3822e3d5 authored by Vy Nguyen's avatar Vy Nguyen
Browse files

[lld-macho] Fix bug in handling unwind info from ld -r

Two changess:
- Drop assertions that all symbols are in GOT
- Set allEntriesAreOmitted correctly

Related bug: 50812

Differential Revision: https://reviews.llvm.org/D105364
parent e5220104
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -167,7 +167,12 @@ void UnwindInfoSectionImpl<Ptr>::prepareRelocations(ConcatInputSection *isec) {
    assert(target->hasAttr(r.type, RelocAttrBits::UNSIGNED));

    if (r.offset % sizeof(CompactUnwindEntry<Ptr>) == 0) {
      if (auto *referentIsec = r.referent.dyn_cast<InputSection *>())
      InputSection *referentIsec;
      if (auto *isec = r.referent.dyn_cast<InputSection *>())
        referentIsec = isec;
      else
        referentIsec = cast<Defined>(r.referent.dyn_cast<Symbol *>())->isec;

      if (!cast<ConcatInputSection>(referentIsec)->shouldOmitFromOutput())
        allEntriesAreOmitted = false;
      continue;
@@ -257,7 +262,6 @@ relocateCompactUnwind(ConcatOutputSection *compactUnwindSection,
      uint64_t referentVA = TombstoneValue<Ptr>;
      if (auto *referentSym = r.referent.dyn_cast<Symbol *>()) {
        if (!isa<Undefined>(referentSym)) {
          assert(referentSym->isInGot());
          if (auto *defined = dyn_cast<Defined>(referentSym))
            checkTextSegment(defined->isec);
          // At this point in the link, we may not yet know the final address of
+101 −0
Original line number Diff line number Diff line
# REQUIRES: x86
## These yaml files were  from an object file produced with 'ld -r', specifically:
##
##  // foo.s
## .text
## .globl _main
## _main:
##   .cfi_startproc
##   .cfi_def_cfa_offset 16
##   .cfi_endproc
##   nop
##
## llvm-mc -filetype=obj -triple=x86_64-apple-macos10.15 -o foo1.o foo.s
## ld -r -o foo.o foo1.o


# RUN: rm -rf %t; mkdir -p %t
# RUN: yaml2obj %s -o %t/foo.o
# RUN: %lld -o %t/a.out %t/foo.o

--- !mach-o
FileHeader:
  magic:           0xFEEDFACF
  cputype:         0x01000007
  cpusubtype:      0x00000003
  filetype:        0x00000001
  ncmds:           2
  sizeofcmds:      384
  flags:           0x00000000
  reserved:        0x00000000
LoadCommands:
  - cmd:             LC_SEGMENT_64
    cmdsize:         312
    segname:         ''
    vmaddr:          0
    vmsize:          64
    fileoff:         448
    filesize:        64
    maxprot:         7
    initprot:        7
    nsects:          2
    flags:           0
    Sections:
      - sectname:        __text
        segname:         __TEXT
        addr:            0x0000000000000000
        size:            1
        offset:          0x000001C0
        align:           0
        reloff:          0x00000000
        nreloc:          0
        flags:           0x80000400
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
        content:         '90'
      - sectname:        __compact_unwind
        segname:         __LD
        addr:            0x0000000000000020
        size:            32
        offset:          0x000001E0
        align:           3
        reloff:          0x00000200
        nreloc:          1
        flags:           0x02000000
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
        content:         '0000000000000000010000000000020200000000000000000000000000000000'
        relocations:
          - address:         0x00000000
            symbolnum:       1
            pcrel:           false
            length:          3
            extern:          true
            type:            0
            scattered:       false
            value:           0
  - cmd:             LC_SYMTAB
    cmdsize:         24
    symoff:          520
    nsyms:           2
    stroff:          552
    strsize:         24
LinkEditData:
  NameList:
    - n_strx:          8
      n_type:          0x0E
      n_sect:          2
      n_desc:          0
      n_value:         8
    - n_strx:          2
      n_type:          0x0F
      n_sect:          1
      n_desc:          32
      n_value:         0
  StringTable:
    - ' '
    - _main

...