[lld] r258672 - [ELF] - Symbols from object files that override symbols in DSO are added to .dynsym table.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 25 11:08:49 PST 2016


On Mon, Jan 25, 2016 at 12:44 AM, George Rimar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: grimar
> Date: Mon Jan 25 02:44:38 2016
> New Revision: 258672
>
> URL: http://llvm.org/viewvc/llvm-project?rev=258672&view=rev
> Log:
> [ELF] - Symbols from object files that override symbols in DSO are added
> to .dynsym table.
>
> Main executable did not export symbols that exist both in the main
> executable and in DSOs before this patch.
> Symbols from object files that override symbols in DSO should be added to
> .dynsym table.
>
> Differential revision: http://reviews.llvm.org/D16405
>
> Added:
>     lld/trunk/test/ELF/Inputs/symbol-override.s
>     lld/trunk/test/ELF/symbol-override.s
> Modified:
>     lld/trunk/ELF/Symbols.cpp
>     lld/trunk/test/ELF/mips-dynamic.s
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=258672&r1=258671&r2=258672&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Mon Jan 25 02:44:38 2016
> @@ -53,6 +53,13 @@ template <class ELFT> int SymbolBody::co
>    if (IsUsedInRegularObj || Other->IsUsedInRegularObj)
>      IsUsedInRegularObj = Other->IsUsedInRegularObj = true;
>
> +  // We want to export all symbols that exist both in the executable
> +  // and in DSOs, so that the symbols in the executable can interrupt
> +  // symbols in the DSO at runtime.
> +  if (isShared() != Other->isShared())
> +    if (isa<DefinedRegular<ELFT>>(isShared() ? Other : this))
>

You could just roll these two conditions into one:

if (isShared() != Other->isShared() && isa<DefinedRegular<ELFT>>(...))


> +      IsUsedInDynamicReloc = Other->IsUsedInDynamicReloc = true;
> +
>    if (L != R)
>      return -1;
>    if (!std::get<0>(L) || !std::get<1>(L) || !std::get<2>(L))
>
> Added: lld/trunk/test/ELF/Inputs/symbol-override.s
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/symbol-override.s?rev=258672&view=auto
>
> ==============================================================================
> --- lld/trunk/test/ELF/Inputs/symbol-override.s (added)
> +++ lld/trunk/test/ELF/Inputs/symbol-override.s Mon Jan 25 02:44:38 2016
> @@ -0,0 +1,16 @@
> +.text
> +.globl foo
> +.type foo, at function
> +foo:
> +nop
> +
> +.globl bar
> +.type bar, at function
> +bar:
> +nop
> +
> +.globl do
> +.type do, at function
> +do:
> +callq foo at PLT
> +callq bar at PLT
>
> Modified: lld/trunk/test/ELF/mips-dynamic.s
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-dynamic.s?rev=258672&r1=258671&r2=258672&view=diff
>
> ==============================================================================
> --- lld/trunk/test/ELF/mips-dynamic.s (original)
> +++ lld/trunk/test/ELF/mips-dynamic.s Mon Jan 25 02:44:38 2016
> @@ -47,8 +47,8 @@
>  # EXE-DAG:    0x70000005 MIPS_FLAGS           NOTPOT
>  # EXE-DAG:    0x70000006 MIPS_BASE_ADDRESS
>  # EXE-DAG:    0x7000000A MIPS_LOCAL_GOTNO     2
> -# EXE-DAG:    0x70000011 MIPS_SYMTABNO        1
> -# EXE-DAG:    0x70000013 MIPS_GOTSYM          0x1
> +# EXE-DAG:    0x70000011 MIPS_SYMTABNO        2
> +# EXE-DAG:    0x70000013 MIPS_GOTSYM          0x2
>  # EXE-DAG:    0x70000016 MIPS_RLD_MAP         [[RLDMAPADDR]]
>  # EXE:      ]
>
>
> Added: lld/trunk/test/ELF/symbol-override.s
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/symbol-override.s?rev=258672&view=auto
>
> ==============================================================================
> --- lld/trunk/test/ELF/symbol-override.s (added)
> +++ lld/trunk/test/ELF/symbol-override.s Mon Jan 25 02:44:38 2016
> @@ -0,0 +1,46 @@
> +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
> +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux
> %p/Inputs/symbol-override.s -o %t2.o
> +// RUN: ld.lld -shared %t2.o -o %t2.so
> +// RUN: ld.lld %t1.o %t2.so -o %t
> +// RUN: llvm-readobj -dyn-symbols %t | FileCheck %s
> +
> +// CHECK:      DynamicSymbols [
> +// CHECK-NEXT:   Symbol {
> +// CHECK-NEXT:     Name:
> +// CHECK-NEXT:     Value: 0x0
> +// CHECK-NEXT:     Size: 0
> +// CHECK-NEXT:     Binding: Local
> +// CHECK-NEXT:     Type: None
> +// CHECK-NEXT:     Other: 0
> +// CHECK-NEXT:     Section: Undefined
> +// CHECK-NEXT:   }
> +// CHECK-NEXT:   Symbol {
> +// CHECK-NEXT:     Name: do
> +// CHECK-NEXT:     Value: 0x0
> +// CHECK-NEXT:     Size: 0
> +// CHECK-NEXT:     Binding: Global
> +// CHECK-NEXT:     Type: Function
> +// CHECK-NEXT:     Other: 0
> +// CHECK-NEXT:     Section: Undefined
> +// CHECK-NEXT:   }
> +// CHECK-NEXT:   Symbol {
> +// CHECK-NEXT:     Name: foo
> +// CHECK-NEXT:     Value: 0x11000
> +// CHECK-NEXT:     Size: 0
> +// CHECK-NEXT:     Binding: Global
> +// CHECK-NEXT:     Type: Function
> +// CHECK-NEXT:     Other: 0
> +// CHECK-NEXT:     Section: .text
> +// CHECK-NEXT:   }
> +// CHECK-NEXT: ]
> +
> +.text
> +.globl foo
> +.type foo, at function
> +foo:
> +nop
> +
> +.text
> +.globl _start
> +_start:
> +callq do
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160125/082548e0/attachment.html>


More information about the llvm-commits mailing list