[llvm] 999f04c - [llvm-objcopy][MachO] Fix isExternalSymbol method
Alexander Shaposhnikov via llvm-commits
llvm-commits at lists.llvm.org
Fri May 1 18:41:53 PDT 2020
Author: Alexander Shaposhnikov
Date: 2020-05-01T18:22:35-07:00
New Revision: 999f04ce347c059238e713971547204f61a34312
URL: https://github.com/llvm/llvm-project/commit/999f04ce347c059238e713971547204f61a34312
DIFF: https://github.com/llvm/llvm-project/commit/999f04ce347c059238e713971547204f61a34312.diff
LOG: [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
Added:
llvm/test/tools/llvm-objcopy/MachO/symbol-table.test
Modified:
llvm/tools/llvm-objcopy/MachO/Object.h
Removed:
################################################################################
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 000000000000..7fec35fde1df
--- /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 a2c007459f2a..b0123732f80a 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(); }
More information about the llvm-commits
mailing list