[lld] r249367 - [elf2] Add __preinit_array, and __fini_array start and end symbols.

Michael Spencer via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 5 19:17:04 PDT 2015


On Mon, Oct 5, 2015 at 6:30 PM, Rui Ueyama <ruiu at google.com> wrote:
> On Mon, Oct 5, 2015 at 6:28 PM, Sean Silva via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>>
>>
>> On Mon, Oct 5, 2015 at 6:16 PM, Michael J. Spencer via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>>>
>>> Author: mspencer
>>> Date: Mon Oct  5 20:16:17 2015
>>> New Revision: 249367
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=249367&view=rev
>>> Log:
>>> [elf2] Add __preinit_array, and __fini_array start and end symbols.
>>>
>>> Added:
>>>     lld/trunk/test/elf2/pre_init_fini_array.s
>>>       - copied, changed from r249365, lld/trunk/test/elf2/init_array.s
>>>     lld/trunk/test/elf2/pre_init_fini_array_missing.s
>>> Removed:
>>>     lld/trunk/test/elf2/init_array.s
>>>     lld/trunk/test/elf2/init_array_missing.s
>>> Modified:
>>>     lld/trunk/ELF/Writer.cpp
>>>
>>> Modified: lld/trunk/ELF/Writer.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=249367&r1=249366&r2=249367&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/ELF/Writer.cpp (original)
>>> +++ lld/trunk/ELF/Writer.cpp Mon Oct  5 20:16:17 2015
>>> @@ -329,13 +329,24 @@ template <class ELFT> void Writer<ELFT>:
>>>    DynamicSec.FiniArraySec =
>>>        Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE |
>>> SHF_ALLOC});
>>>
>>> -  if (OutputSection<ELFT> *OS = DynamicSec.InitArraySec) {
>>> -    Symtab.addSyntheticSym<ELFT>("__init_array_start", *OS, 0);
>>> -    Symtab.addSyntheticSym<ELFT>("__init_array_end", *OS,
>>> OS->getSize());
>>> -  } else {
>>> -    Symtab.addIgnoredSym<ELFT>("__init_array_start");
>>> -    Symtab.addIgnoredSym<ELFT>("__init_array_end");
>>> -  }
>>> +  auto addStartEnd = [&Symtab](StringRef StartName, StringRef EndName,
>>> +    OutputSection<ELFT> *OS) {
>>> +    if (OS) {
>>> +      Symtab.addSyntheticSym<ELFT>(StartName, *OS, 0);
>>> +      Symtab.addSyntheticSym<ELFT>(EndName, *OS, OS->getSize());
>>> +    }
>>> +    else {
>>
>>
>> format
>
>
> Also I'd use shorter names (drop "Name" from the parameters) and early
> return.
>

Both fixed in r249368

- Michael Spencer.

>>
>> -- Sean Silva
>>
>>>
>>> +      Symtab.addIgnoredSym<ELFT>(StartName);
>>> +      Symtab.addIgnoredSym<ELFT>(EndName);
>>> +    }
>>> +  };
>>> +
>>> +  addStartEnd("__preinit_array_start", "__preinit_array_end",
>>> +    DynamicSec.PreInitArraySec);
>>> +  addStartEnd("__init_array_start", "__init_array_end",
>>> +    DynamicSec.InitArraySec);
>>> +  addStartEnd("__fini_array_start", "__fini_array_end",
>>> +    DynamicSec.FiniArraySec);
>>>
>>>    // FIXME: Try to avoid the extra walk over all global symbols.
>>>    std::vector<DefinedCommon<ELFT> *> CommonSymbols;
>>>
>>> Removed: lld/trunk/test/elf2/init_array.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/init_array.s?rev=249366&view=auto
>>>
>>> ==============================================================================
>>> --- lld/trunk/test/elf2/init_array.s (original)
>>> +++ lld/trunk/test/elf2/init_array.s (removed)
>>> @@ -1,90 +0,0 @@
>>> -// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
>>> -// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux
>>> %p/Inputs/shared.s -o %t2
>>> -// RUN: lld -flavor gnu2 %t2 -o t2.so -shared
>>> -// RUN: lld -flavor gnu2 %t t2.so -o %t2
>>> -// RUN: llvm-readobj -symbols -sections -dynamic-table %t2 | FileCheck
>>> %s
>>> -// RUN: llvm-objdump -d %t2 | FileCheck --check-prefix=DISASM %s
>>> -// REQUIRES: x86
>>> -
>>> -.globl _start
>>> -_start:
>>> -  call __init_array_start
>>> -  call __init_array_end
>>> -
>>> -
>>> -.section .init_array,"aw", at init_array
>>> -  .quad 0
>>> -
>>> -.section .preinit_array,"aw", at preinit_array
>>> -        .quad 0
>>> -        .byte 0
>>> -
>>> -.section .fini_array,"aw", at fini_array
>>> -        .quad 0
>>> -        .short 0
>>> -
>>> -// CHECK:      Name: .init_array
>>> -// CHECK-NEXT: Type: SHT_INIT_ARRAY
>>> -// CHECK-NEXT: Flags [
>>> -// CHECK-NEXT:   SHF_ALLOC
>>> -// CHECK-NEXT:   SHF_WRITE
>>> -// CHECK-NEXT: ]
>>> -// CHECK-NEXT: Address: [[INIT_ADDR:.*]]
>>> -// CHECK-NEXT: Offset:
>>> -// CHECK-NEXT: Size: [[INIT_SIZE:.*]]
>>> -
>>> -
>>> -// CHECK:     Name: .preinit_array
>>> -// CHECK-NEXT: Type: SHT_PREINIT_ARRAY
>>> -// CHECK-NEXT: Flags [
>>> -// CHECK-NEXT:   SHF_ALLOC
>>> -// CHECK-NEXT:   SHF_WRITE
>>> -// CHECK-NEXT:    ]
>>> -// CHECK-NEXT: Address: [[PREINIT_ADDR:.*]]
>>> -// CHECK-NEXT: Offset:
>>> -// CHECK-NEXT: Size: [[PREINIT_SIZE:.*]]
>>> -
>>> -
>>> -// CHECK:      Name: .fini_array
>>> -// CHECK-NEXT: Type: SHT_FINI_ARRAY
>>> -// CHECK-NEXT: Flags [
>>> -// CHECK-NEXT:   SHF_ALLOC
>>> -// CHECK-NEXT:   SHF_WRITE
>>> -// CHECK-NEXT: ]
>>> -// CHECK-NEXT: Address: [[FINI_ADDR:.*]]
>>> -// CHECK-NEXT: Offset:
>>> -// CHECK-NEXT: Size: [[FINI_SIZE:.*]]
>>> -
>>> -// CHECK:        Name: __init_array_end
>>> -// CHECK-NEXT:   Value: 0x13008
>>> -// CHECK-NEXT:   Size: 0
>>> -// CHECK-NEXT:   Binding: Local
>>> -// CHECK-NEXT:   Type: None
>>> -// CHECK-NEXT:   Other: 0
>>> -// CHECK-NEXT:   Section: .init_array
>>> -// CHECK-NEXT: }
>>> -// CHECK-NEXT: Symbol {
>>> -// CHECK-NEXT:   Name: __init_array_start
>>> -// CHECK-NEXT:   Value: [[INIT_ADDR]]
>>> -// CHECK-NEXT:   Size: 0
>>> -// CHECK-NEXT:   Binding: Local
>>> -// CHECK-NEXT:   Type: None
>>> -// CHECK-NEXT:   Other: 0
>>> -// CHECK-NEXT:   Section: .init_array
>>> -// CHECK-NEXT: }
>>> -
>>> -
>>> -// CHECK: DynamicSection
>>> -// CHECK: PREINIT_ARRAY        [[PREINIT_ADDR]]
>>> -// CHECK: PREINIT_ARRAYSZ      [[PREINIT_SIZE]] (bytes)
>>> -// CHECK: INIT_ARRAY           [[INIT_ADDR]]
>>> -// CHECK: INIT_ARRAYSZ         [[INIT_SIZE]] (bytes)
>>> -// CHECK: FINI_ARRAY           [[FINI_ADDR]]
>>> -// CHECK: FINI_ARRAYSZ         [[FINI_SIZE]] (bytes)
>>> -
>>> -
>>> -// 0x13000 - (0x12000 + 5) = 4091
>>> -// 0x13008 - (0x12005 + 5) = 4094
>>> -// DISASM:      _start:
>>> -// DISASM-NEXT:   12000:  e8 fb 0f 00 00  callq  4091
>>> -// DISASM-NEXT:   12005:  e8 fe 0f 00 00  callq  4094
>>>
>>> Removed: lld/trunk/test/elf2/init_array_missing.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/init_array_missing.s?rev=249366&view=auto
>>>
>>> ==============================================================================
>>> --- lld/trunk/test/elf2/init_array_missing.s (original)
>>> +++ lld/trunk/test/elf2/init_array_missing.s (removed)
>>> @@ -1,18 +0,0 @@
>>> -// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
>>> -// RUN: lld -flavor gnu2 %t -o %t2
>>> -// RUN: llvm-objdump -d %t2 | FileCheck %s
>>> -// REQUIRES: x86
>>> -
>>> -.globl _start
>>> -_start:
>>> -  call __init_array_start
>>> -  call __init_array_end
>>> -
>>> -// With no .init_array section the symbols resolve to 0
>>> -// 0 - (0x11000 + 5) = -69637
>>> -// 0 - (0x11005 + 5) = -69642
>>> -
>>> -// CHECK: Disassembly of section .text:
>>> -// CHECK-NEXT:  _start:
>>> -// CHECK-NEXT:   11000:        e8 fb ef fe ff  callq   -69637
>>> -// CHECK-NEXT:   11005:        e8 f6 ef fe ff  callq   -69642
>>>
>>> Copied: lld/trunk/test/elf2/pre_init_fini_array.s (from r249365,
>>> lld/trunk/test/elf2/init_array.s)
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/pre_init_fini_array.s?p2=lld/trunk/test/elf2/pre_init_fini_array.s&p1=lld/trunk/test/elf2/init_array.s&r1=249365&r2=249367&rev=249367&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/test/elf2/init_array.s (original)
>>> +++ lld/trunk/test/elf2/pre_init_fini_array.s Mon Oct  5 20:16:17 2015
>>> @@ -8,8 +8,12 @@
>>>
>>>  .globl _start
>>>  _start:
>>> +  call __preinit_array_start
>>> +  call __preinit_array_end
>>>    call __init_array_start
>>>    call __init_array_end
>>> +  call __fini_array_start
>>> +  call __fini_array_end
>>>
>>>
>>>  .section .init_array,"aw", at init_array
>>> @@ -55,7 +59,25 @@ _start:
>>>  // CHECK-NEXT: Offset:
>>>  // CHECK-NEXT: Size: [[FINI_SIZE:.*]]
>>>
>>> -// CHECK:        Name: __init_array_end
>>> +// CHECK:        Name: __fini_array_end
>>> +// CHECK-NEXT:   Value: 0x1301B
>>> +// CHECK-NEXT:   Size: 0
>>> +// CHECK-NEXT:   Binding: Local
>>> +// CHECK-NEXT:   Type: None
>>> +// CHECK-NEXT:   Other: 0
>>> +// CHECK-NEXT:   Section: .fini_array
>>> +// CHECK-NEXT: }
>>> +// CHECK-NEXT: Symbol {
>>> +// CHECK-NEXT:   Name: __fini_array_start
>>> +// CHECK-NEXT:   Value: [[FINI_ADDR]]
>>> +// CHECK-NEXT:   Size: 0
>>> +// CHECK-NEXT:   Binding: Local
>>> +// CHECK-NEXT:   Type: None
>>> +// CHECK-NEXT:   Other: 0
>>> +// CHECK-NEXT:   Section: .fini_array
>>> +// CHECK-NEXT: }
>>> +// CHECK-NEXT: Symbol {
>>> +// CHECK-NEXT:   Name: __init_array_end
>>>  // CHECK-NEXT:   Value: 0x13008
>>>  // CHECK-NEXT:   Size: 0
>>>  // CHECK-NEXT:   Binding: Local
>>> @@ -72,7 +94,24 @@ _start:
>>>  // CHECK-NEXT:   Other: 0
>>>  // CHECK-NEXT:   Section: .init_array
>>>  // CHECK-NEXT: }
>>> -
>>> +// CHECK-NEXT: Symbol {
>>> +// CHECK-NEXT:   Name: __preinit_array_end
>>> +// CHECK-NEXT:   Value: 0x13011
>>> +// CHECK-NEXT:   Size: 0
>>> +// CHECK-NEXT:   Binding: Local
>>> +// CHECK-NEXT:   Type: None
>>> +// CHECK-NEXT:   Other: 0
>>> +// CHECK-NEXT:   Section: .preinit_array
>>> +// CHECK-NEXT: }
>>> +// CHECK-NEXT: Symbol {
>>> +// CHECK-NEXT:   Name: __preinit_array_start
>>> +// CHECK-NEXT:   Value: [[PREINIT_ADDR]]
>>> +// CHECK-NEXT:   Size: 0
>>> +// CHECK-NEXT:   Binding: Local
>>> +// CHECK-NEXT:   Type: None
>>> +// CHECK-NEXT:   Other: 0
>>> +// CHECK-NEXT:   Section: .preinit_array
>>> +// CHECK-NEXT: }
>>>
>>>  // CHECK: DynamicSection
>>>  // CHECK: PREINIT_ARRAY        [[PREINIT_ADDR]]
>>> @@ -83,8 +122,16 @@ _start:
>>>  // CHECK: FINI_ARRAYSZ         [[FINI_SIZE]] (bytes)
>>>
>>>
>>> -// 0x13000 - (0x12000 + 5) = 4091
>>> -// 0x13008 - (0x12005 + 5) = 4094
>>> +// 0x13008 - (0x12000 + 5) = 4099
>>> +// 0x13011 - (0x12005 + 5) = 4103
>>> +// 0x13000 - (0x1200a + 5) = 4081
>>> +// 0x13008 - (0x1200f + 5) = 4084
>>> +// 0x13011 - (0x12014 + 5) = 4088
>>> +// 0x1301B - (0x12019 + 5) = 4093
>>>  // DISASM:      _start:
>>> -// DISASM-NEXT:   12000:  e8 fb 0f 00 00  callq  4091
>>> -// DISASM-NEXT:   12005:  e8 fe 0f 00 00  callq  4094
>>> +// DISASM-NEXT:   12000:  e8 {{.*}}  callq  4099
>>> +// DISASM-NEXT:   12005:  e8 {{.*}}  callq  4103
>>> +// DISASM-NEXT:   1200a:  e8 {{.*}}  callq  4081
>>> +// DISASM-NEXT:   1200f:  e8 {{.*}}  callq  4084
>>> +// DISASM-NEXT:   12014:  e8 {{.*}}  callq  4088
>>> +// DISASM-NEXT:   12019:  e8 {{.*}}  callq  4093
>>>
>>> Added: lld/trunk/test/elf2/pre_init_fini_array_missing.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/pre_init_fini_array_missing.s?rev=249367&view=auto
>>>
>>> ==============================================================================
>>> --- lld/trunk/test/elf2/pre_init_fini_array_missing.s (added)
>>> +++ lld/trunk/test/elf2/pre_init_fini_array_missing.s Mon Oct  5 20:16:17
>>> 2015
>>> @@ -0,0 +1,30 @@
>>> +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
>>> +// RUN: lld -flavor gnu2 %t -o %t2
>>> +// RUN: llvm-objdump -d %t2 | FileCheck %s
>>> +// REQUIRES: x86
>>> +
>>> +.globl _start
>>> +_start:
>>> +  call __preinit_array_start
>>> +  call __preinit_array_end
>>> +  call __init_array_start
>>> +  call __init_array_end
>>> +  call __fini_array_start
>>> +  call __fini_array_end
>>> +
>>> +// With no .init_array section the symbols resolve to 0
>>> +// 0 - (0x11000 + 5) = -69637
>>> +// 0 - (0x11005 + 5) = -69642
>>> +// 0 - (0x1100a + 5) = -69647
>>> +// 0 - (0x1100f + 5) = -69652
>>> +// 0 - (0x11014 + 5) = -69657
>>> +// 0 - (0x11019 + 5) = -69662
>>> +
>>> +// CHECK: Disassembly of section .text:
>>> +// CHECK-NEXT:  _start:
>>> +// CHECK-NEXT:   11000:    e8 fb ef fe ff     callq    -69637
>>> +// CHECK-NEXT:   11005:    e8 f6 ef fe ff     callq    -69642
>>> +// CHECK-NEXT:   1100a:    e8 f1 ef fe ff     callq    -69647
>>> +// CHECK-NEXT:   1100f:    e8 ec ef fe ff     callq    -69652
>>> +// CHECK-NEXT:   11014:    e8 e7 ef fe ff     callq    -69657
>>> +// CHECK-NEXT:   11019:    e8 e2 ef fe ff     callq    -69662
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>


More information about the llvm-commits mailing list