From 999f04ce347c059238e713971547204f61a34312 Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Fri, 1 May 2020 18:22:35 -0700 Subject: [PATCH] [llvm-objcopy][MachO] Fix isExternalSymbol method N_PEXT bit should not affect whether a symbol is considered to be external or not. This also fixes the construction of the symbol table since it relies on the correct ordering of symbols. Test plan: make check-all Differential revision: https://reviews.llvm.org/D78888 --- .../tools/llvm-objcopy/MachO/symbol-table.test | 437 +++++++++++++++++++++ llvm/tools/llvm-objcopy/MachO/Object.h | 4 +- 2 files changed, 438 insertions(+), 3 deletions(-) create mode 100644 llvm/test/tools/llvm-objcopy/MachO/symbol-table.test diff --git a/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test b/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test new file mode 100644 index 0000000..7fec35f --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test @@ -0,0 +1,437 @@ +## This test is based on a trimmed down version of the binary built as follows: +## a.c: +## __attribute__((used)) static int PrivateSymbol; +## __attribute__((visibility("hidden"))) int PrivateExternalSymbol; +## __attribute__((used)) int CommonSymbol; +## extern int UndefinedExternalSymbol; +## // Defined external symbol +## int main() { +## return PrivateSymbol + PrivateExternalSymbol + CommonSymbol + +## UndefinedExternalSymbol; +## } +## build command: +## clang -g -fno-exceptions -fno-unwind-tables -undefined dynamic_lookup \ +## a.c -o a.exe +## All the load commands except the symbol table and its transitive dependencies +## have been removed. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t.copy +# RUN: cmp %t %t.copy + +## Verify that the binary is valid and check its symbol table. +# RUN: llvm-readobj --symbols %t.copy | FileCheck %s + +# CHECK: Symbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _PrivateSymbol (169) +# CHECK-NEXT: Type: Section (0xE) +# CHECK-NEXT: Section: __bss (0x4) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100001008 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _PrivateExternalSymbol (121) +# CHECK-NEXT: PrivateExtern +# CHECK-NEXT: Type: Section (0xE) +# CHECK-NEXT: Section: __common (0x5) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100001010 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: /Users/aaaaaaaa/ (191) +# CHECK-NEXT: Type: SymDebugTable (0x64) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: main.c (184) +# CHECK-NEXT: Type: SymDebugTable (0x64) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: /var/folders/1d/zyfdpp7j2995h5hqspjy28bc0000gn/T/main-c5ac21.o (38) +# CHECK-NEXT: Type: SymDebugTable (0x66) +# CHECK-NEXT: Section: __got (0x3) +# CHECK-NEXT: RefType: ReferenceFlagUndefinedLazy (0x1) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x5EA74C81 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: (207) +# CHECK-NEXT: Type: SymDebugTable (0x2E) +# CHECK-NEXT: Section: __text (0x1) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100000F80 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _main (101) +# CHECK-NEXT: Type: SymDebugTable (0x24) +# CHECK-NEXT: Section: __text (0x1) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100000F80 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: (207) +# CHECK-NEXT: Type: SymDebugTable (0x24) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x2D +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: (207) +# CHECK-NEXT: Type: SymDebugTable (0x4E) +# CHECK-NEXT: Section: __text (0x1) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x2D +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _PrivateSymbol (169) +# CHECK-NEXT: Type: SymDebugTable (0x26) +# CHECK-NEXT: Section: __bss (0x4) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100001008 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _CommonSymbol (107) +# CHECK-NEXT: Type: SymDebugTable (0x20) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _PrivateExternalSymbol (121) +# CHECK-NEXT: Type: SymDebugTable (0x20) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: (207) +# CHECK-NEXT: Type: SymDebugTable (0x64) +# CHECK-NEXT: Section: __text (0x1) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _CommonSymbol (107) +# CHECK-NEXT: Extern +# CHECK-NEXT: Type: Section (0xE) +# CHECK-NEXT: Section: __common (0x5) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x10000100C +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __mh_execute_header (18) +# CHECK-NEXT: Extern +# CHECK-NEXT: Type: Section (0xE) +# CHECK-NEXT: Section: __text (0x1) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x10) +# CHECK-NEXT: ReferencedDynamically (0x10) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100000000 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _main (101) +# CHECK-NEXT: Extern +# CHECK-NEXT: Type: Section (0xE) +# CHECK-NEXT: Section: __text (0x1) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x100000F80 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _UndefinedExternalSymbol (144) +# CHECK-NEXT: Extern +# CHECK-NEXT: Type: Undef (0x0) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0xFE00) +# CHECK-NEXT: AltEntry (0x200) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: dyld_stub_binder (1) +# CHECK-NEXT: Extern +# CHECK-NEXT: Type: Undef (0x0) +# CHECK-NEXT: Section: (0x0) +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) +# CHECK-NEXT: Flags [ (0x100) +# CHECK-NEXT: ] +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x80000003 + filetype: 0x00000002 + ncmds: 5 + sizeofcmds: 720 + flags: 0x00200085 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: __TEXT + vmaddr: 4294967296 + vmsize: 4096 + fileoff: 0 + filesize: 4096 + maxprot: 5 + initprot: 5 + nsects: 2 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000100000F80 + size: 45 + offset: 0x00000F80 + align: 4 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + content: 554889E5488B0575000000488D0D7A000000C745FC000000008B156900000003156B0000000311031089D05DC3 + - sectname: __unwind_info + segname: __TEXT + addr: 0x0000000100000FB0 + size: 72 + offset: 0x00000FB0 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + content: 010000001C000000000000001C000000000000001C00000002000000800F00003400000034000000AE0F00000000000034000000030000000C000100100001000000000000000000 + - cmd: LC_SEGMENT_64 + cmdsize: 312 + segname: __DATA + vmaddr: 4294971392 + vmsize: 4096 + fileoff: 4096 + filesize: 4096 + maxprot: 3 + initprot: 3 + nsects: 3 + flags: 0 + Sections: + - sectname: __got + segname: __DATA + addr: 0x0000000100001000 + size: 8 + offset: 0x00001000 + align: 3 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000006 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + content: '0000000000000000' + - sectname: __bss + segname: __DATA + addr: 0x0000000100001008 + size: 4 + offset: 0x00000000 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000001 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __common + segname: __DATA + addr: 0x000000010000100C + size: 8 + offset: 0x00000000 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000001 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __LINKEDIT + vmaddr: 4294975488 + vmsize: 4096 + fileoff: 8192 + filesize: 500 + maxprot: 1 + initprot: 1 + nsects: 0 + flags: 0 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 8192 + nsyms: 18 + stroff: 8484 + strsize: 208 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 13 + iextdefsym: 13 + nextdefsym: 3 + iundefsym: 16 + nundefsym: 2 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 8480 + nindirectsyms: 1 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 +LinkEditData: + NameList: + - n_strx: 169 + n_type: 0x0E + n_sect: 4 + n_desc: 0 + n_value: 4294971400 + - n_strx: 121 + n_type: 0x1E + n_sect: 5 + n_desc: 0 + n_value: 4294971408 + - n_strx: 191 + n_type: 0x64 + n_sect: 0 + n_desc: 0 + n_value: 0 + - n_strx: 184 + n_type: 0x64 + n_sect: 0 + n_desc: 0 + n_value: 0 + - n_strx: 38 + n_type: 0x66 + n_sect: 3 + n_desc: 1 + n_value: 1588022401 + - n_strx: 207 + n_type: 0x2E + n_sect: 1 + n_desc: 0 + n_value: 4294971264 + - n_strx: 101 + n_type: 0x24 + n_sect: 1 + n_desc: 0 + n_value: 4294971264 + - n_strx: 207 + n_type: 0x24 + n_sect: 0 + n_desc: 0 + n_value: 45 + - n_strx: 207 + n_type: 0x4E + n_sect: 1 + n_desc: 0 + n_value: 45 + - n_strx: 169 + n_type: 0x26 + n_sect: 4 + n_desc: 0 + n_value: 4294971400 + - n_strx: 107 + n_type: 0x20 + n_sect: 0 + n_desc: 0 + n_value: 0 + - n_strx: 121 + n_type: 0x20 + n_sect: 0 + n_desc: 0 + n_value: 0 + - n_strx: 207 + n_type: 0x64 + n_sect: 1 + n_desc: 0 + n_value: 0 + - n_strx: 107 + n_type: 0x0F + n_sect: 5 + n_desc: 0 + n_value: 4294971404 + - n_strx: 18 + n_type: 0x0F + n_sect: 1 + n_desc: 16 + n_value: 4294967296 + - n_strx: 101 + n_type: 0x0F + n_sect: 1 + n_desc: 0 + n_value: 4294971264 + - n_strx: 144 + n_type: 0x01 + n_sect: 0 + n_desc: 65024 + n_value: 0 + - n_strx: 1 + n_type: 0x01 + n_sect: 0 + n_desc: 256 + n_value: 0 + StringTable: + - '' + - dyld_stub_binder + - __mh_execute_header + - '/var/folders/1d/zyfdpp7j2995h5hqspjy28bc0000gn/T/main-c5ac21.o' + - _main + - _CommonSymbol + - _PrivateExternalSymbol + - _UndefinedExternalSymbol + - _PrivateSymbol + - main.c + - '/Users/aaaaaaaa/' +... diff --git a/llvm/tools/llvm-objcopy/MachO/Object.h b/llvm/tools/llvm-objcopy/MachO/Object.h index a2c0074..b012373 100644 --- a/llvm/tools/llvm-objcopy/MachO/Object.h +++ b/llvm/tools/llvm-objcopy/MachO/Object.h @@ -107,9 +107,7 @@ struct SymbolEntry { uint16_t n_desc; uint64_t n_value; - bool isExternalSymbol() const { - return n_type & ((MachO::N_EXT | MachO::N_PEXT)); - } + bool isExternalSymbol() const { return n_type & MachO::N_EXT; } bool isLocalSymbol() const { return !isExternalSymbol(); } -- 2.7.4