From 01fa41a106ed0ff86c3b9ffe0843679211bf487c Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Fri, 21 Sep 2012 07:08:08 +0000 Subject: [PATCH] Fix SymbolRef::getAddress implementation for ELF. The 'value' field in symbol table entry should be treated differently for relocatable and relocated files. This patch fixes symbol addresses printed by llvm-nm for executables and shared objects. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164365 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELF.h | 13 ++++++++++++- include/llvm/Object/ObjectFile.h | 2 ++ test/Object/nm-shared-object.test | 26 +++++++++++++++++--------- test/Object/objdump-symbol-table.test | 8 ++++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 03a1417bedf..2e6a7d8c1fb 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -951,7 +951,18 @@ error_code ELFObjectFile case ELF::STT_FUNC: case ELF::STT_OBJECT: case ELF::STT_NOTYPE: - Result = symb->st_value + (Section ? Section->sh_addr : 0); + bool IsRelocatable; + switch(Header->e_type) { + case ELF::ET_EXEC: + case ELF::ET_DYN: + IsRelocatable = false; + break; + default: + IsRelocatable = true; + } + Result = symb->st_value; + if (IsRelocatable && Section != 0) + Result += Section->sh_addr; return object_error::success; default: Result = UnknownAddressOrSize; diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index da4cef22665..1709974ac56 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -212,6 +212,8 @@ public: error_code getNext(SymbolRef &Result) const; error_code getName(StringRef &Result) const; + /// Returns the symbol virtual address (i.e. address at which it will be + /// mapped). error_code getAddress(uint64_t &Result) const; error_code getFileOffset(uint64_t &Result) const; error_code getSize(uint64_t &Result) const; diff --git a/test/Object/nm-shared-object.test b/test/Object/nm-shared-object.test index b361df53555..a57b9401ad4 100644 --- a/test/Object/nm-shared-object.test +++ b/test/Object/nm-shared-object.test @@ -1,15 +1,23 @@ RUN: llvm-nm -D %p/Inputs/shared-object-test.elf-i386 \ -RUN: | FileCheck %s -check-prefix ELF +RUN: | FileCheck %s -check-prefix ELF-32 RUN: llvm-nm -D %p/Inputs/shared-object-test.elf-x86-64 \ -RUN: | FileCheck %s -check-prefix ELF +RUN: | FileCheck %s -check-prefix ELF-64 ; Note: tls_sym should be 'D' (not '?'), but TLS is not ; yet recognized by ObjectFile. -ELF: {{[0-9a-f]+}} A __bss_start -ELF: {{[0-9a-f]+}} A _edata -ELF: {{[0-9a-f]+}} A _end -ELF: {{[0-9a-f]+}} B common_sym -ELF: {{[0-9a-f]+}} D defined_sym -ELF: {{[0-9a-f]+}} T global_func -ELF: ? tls_sym +ELF-32: 0012c8 A __bss_start +ELF-32: 0012c8 A _edata +ELF-32: 0012cc A _end +ELF-32: 0012c8 B common_sym +ELF-32: 0012c4 D defined_sym +ELF-32: 0001f0 T global_func +ELF-32: ? tls_sym + +ELF-64: 200454 A __bss_start +ELF-64: 200454 A _edata +ELF-64: 200458 A _end +ELF-64: 200454 B common_sym +ELF-64: 200450 D defined_sym +ELF-64: 0002f0 T global_func +ELF-64: ? tls_sym diff --git a/test/Object/objdump-symbol-table.test b/test/Object/objdump-symbol-table.test index 989ec04a8dd..c94b0777355 100644 --- a/test/Object/objdump-symbol-table.test +++ b/test/Object/objdump-symbol-table.test @@ -4,6 +4,8 @@ RUN: llvm-objdump -t %p/Inputs/trivial-object-test.elf-i386 \ RUN: | FileCheck %s -check-prefix ELF-i386 RUN: llvm-objdump -t %p/Inputs/trivial-object-test.macho-i386 \ RUN: | FileCheck %s -check-prefix macho-i386 +RUN: llvm-objdump -t %p/Inputs/shared-object-test.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF-shared COFF-i386: file format COFF-i386: SYMBOL TABLE: @@ -31,3 +33,9 @@ macho-i386: SYMBOL TABLE: macho-i386: 00000000 g F __TEXT,__text 00000024 _main macho-i386: 00000000 *UND* 00000000 _SomeOtherFunction macho-i386: 00000000 *UND* 00000000 _puts + +ELF-shared: shared-object-test.elf-i386: file format +ELF-shared: SYMBOL TABLE: +ELF-shared: 00000200 l F .text 00000003 local_func +ELF-shared: 000012c4 g .data 00000004 defined_sym +ELF-shared: 000001f0 g F .text 00000003 global_func -- 2.34.1