llvm-project/lld/test/LinkerScript/sections.test

625 lines
14 KiB
Plaintext

/*
This test exercises parsing typical commands found in GNU ld linker scripts.
RUN: linker-script-test %s | FileCheck %s
*/
SEARCH_DIR("/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu");
SECTIONS
{
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.rela.dyn :
{
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
}
.rela.plt :
{
*(.rela.plt)
PROVIDE_HIDDEN (__rela_iplt_start = .);
*(.rela.iplt)
PROVIDE_HIDDEN (__rela_iplt_end = .);
}
.init :
{
FILL (0x90909090)
KEEP (*(SORT_NONE(.init)))
} =0x909090909090909090909090
PROVIDE (__etext = .);
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
.exception_ranges : ONLY_IF_RO { *(.exception_ranges
.exception_ranges*) }
. = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
.ctors :
{
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
}
. = DATA_SEGMENT_RELRO_END (SIZEOF (.got.plt) >= 24 ? 24 : 0, .);
.got.plt : { *(.got.plt) *(.igot.plt) }
.lrodata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
{
*(.lrodata .lrodata.* .gnu.linkonce.lr.*)
}
.ldata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
{
*(.ldata .ldata.* .gnu.linkonce.l.*)
. = ALIGN(. != 0 ? 64 / 8 : 1);
}
. = ALIGN(64 / 8);
_end = .; PROVIDE (end = .);
. = DATA_SEGMENT_END (.);
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
}
/*
CHECK: kw_search_dir: SEARCH_DIR
CHECK: l_paren: (
CHECK: identifier: /usr/x86_64-linux-gnu/lib64
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: kw_search_dir: SEARCH_DIR
CHECK: l_paren: (
CHECK: identifier: =/usr/local/lib/x86_64-linux-gnu
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: kw_sections: SECTIONS
CHECK: l_brace: {
CHECK: kw_provide: PROVIDE
CHECK: l_paren: (
CHECK: identifier: __executable_start
CHECK: equal: =
CHECK: identifier: SEGMENT_START
CHECK: l_paren: (
CHECK: identifier: text-segment
CHECK: comma: ,
CHECK: number: 0x400000
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: .
CHECK: equal: =
CHECK: identifier: SEGMENT_START
CHECK: l_paren: (
CHECK: identifier: text-segment
CHECK: comma: ,
CHECK: number: 0x400000
CHECK: r_paren: )
CHECK: plus: +
CHECK: identifier: SIZEOF_HEADERS
CHECK: semicolon: ;
CHECK: identifier: .interp
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .interp
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .note.gnu.build-id
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .note.gnu.build-id
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .hash
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .hash
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .rela.dyn
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .rela.init
CHECK: r_paren: )
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .rela.text
CHECK: identifier: .rela.text.*
CHECK: identifier: .rela.gnu.linkonce.t.*
CHECK: r_paren: )
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .rela.fini
CHECK: r_paren: )
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .rela.rodata
CHECK: identifier: .rela.rodata.*
CHECK: identifier: .rela.gnu.linkonce.r.*
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .rela.plt
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .rela.plt
CHECK: r_paren: )
CHECK: kw_provide_hidden: PROVIDE_HIDDEN
CHECK: l_paren: (
CHECK: identifier: __rela_iplt_start
CHECK: equal: =
CHECK: identifier: .
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .rela.iplt
CHECK: r_paren: )
CHECK: kw_provide_hidden: PROVIDE_HIDDEN
CHECK: l_paren: (
CHECK: identifier: __rela_iplt_end
CHECK: equal: =
CHECK: identifier: .
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: r_brace: }
CHECK: identifier: .init
CHECK: colon: :
CHECK: l_brace: {
CHECK: kw_fill: FILL
CHECK: l_paren: (
CHECK: number: 0x90909090
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: kw_sort_none: SORT_NONE
CHECK: l_paren: (
CHECK: identifier: .init
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: kw_provide: PROVIDE
CHECK: l_paren: (
CHECK: identifier: __etext
CHECK: equal: =
CHECK: identifier: .
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: .eh_frame
CHECK: colon: :
CHECK: kw_only_if_ro: ONLY_IF_RO
CHECK: l_brace: {
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .eh_frame
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .exception_ranges
CHECK: colon: :
CHECK: kw_only_if_ro: ONLY_IF_RO
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .exception_ranges
CHECK: identifier: .exception_ranges*
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .
CHECK: equal: =
CHECK: kw_align: ALIGN
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: minus: -
CHECK: l_paren: (
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: minus: -
CHECK: identifier: .
CHECK: r_paren: )
CHECK: amp: &
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: minus: -
CHECK: number: 1
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: .
CHECK: equal: =
CHECK: identifier: DATA_SEGMENT_ALIGN
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: comma: ,
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: COMMONPAGESIZE
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: .eh_frame
CHECK: colon: :
CHECK: kw_only_if_rw: ONLY_IF_RW
CHECK: l_brace: {
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .eh_frame
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .ctors
CHECK: colon: :
CHECK: l_brace: {
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: identifier: *crtbegin.o
CHECK: l_paren: (
CHECK: identifier: .ctors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: identifier: *crtbegin?.o
CHECK: l_paren: (
CHECK: identifier: .ctors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: kw_exclude_file: EXCLUDE_FILE
CHECK: l_paren: (
CHECK: identifier: *crtend.o
CHECK: identifier: *crtend?.o
CHECK: r_paren: )
CHECK: identifier: .ctors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: kw_sort_by_name: SORT
CHECK: l_paren: (
CHECK: identifier: .ctors.*
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .ctors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .dtors
CHECK: colon: :
CHECK: l_brace: {
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: identifier: *crtbegin.o
CHECK: l_paren: (
CHECK: identifier: .dtors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: identifier: *crtbegin?.o
CHECK: l_paren: (
CHECK: identifier: .dtors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: kw_exclude_file: EXCLUDE_FILE
CHECK: l_paren: (
CHECK: identifier: *crtend.o
CHECK: identifier: *crtend?.o
CHECK: r_paren: )
CHECK: identifier: .dtors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: kw_sort_by_name: SORT
CHECK: l_paren: (
CHECK: identifier: .dtors.*
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: kw_keep: KEEP
CHECK: l_paren: (
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .dtors
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .
CHECK: equal: =
CHECK: identifier: DATA_SEGMENT_RELRO_END
CHECK: l_paren: (
CHECK: identifier: SIZEOF
CHECK: l_paren: (
CHECK: identifier: .got.plt
CHECK: r_paren: )
CHECK: greaterequal: >=
CHECK: number: 24
CHECK: question: ?
CHECK: number: 24
CHECK: colon: :
CHECK: number: 0
CHECK: comma: ,
CHECK: identifier: .
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: .got.plt
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .got.plt
CHECK: r_paren: )
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .igot.plt
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .lrodata
CHECK: kw_align: ALIGN
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: plus: +
CHECK: l_paren: (
CHECK: identifier: .
CHECK: amp: &
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: minus: -
CHECK: number: 1
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .lrodata
CHECK: identifier: .lrodata.*
CHECK: identifier: .gnu.linkonce.lr.*
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: identifier: .ldata
CHECK: kw_align: ALIGN
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: plus: +
CHECK: l_paren: (
CHECK: identifier: .
CHECK: amp: &
CHECK: l_paren: (
CHECK: identifier: CONSTANT
CHECK: l_paren: (
CHECK: identifier: MAXPAGESIZE
CHECK: r_paren: )
CHECK: minus: -
CHECK: number: 1
CHECK: r_paren: )
CHECK: r_paren: )
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .ldata
CHECK: identifier: .ldata.*
CHECK: identifier: .gnu.linkonce.l.*
CHECK: r_paren: )
CHECK: identifier: .
CHECK: equal: =
CHECK: kw_align: ALIGN
CHECK: l_paren: (
CHECK: identifier: .
CHECK: exclaimequal: !=
CHECK: number: 0
CHECK: question: ?
CHECK: number: 64
CHECK: slash: /
CHECK: number: 8
CHECK: colon: :
CHECK: number: 1
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: r_brace: }
CHECK: identifier: .
CHECK: equal: =
CHECK: kw_align: ALIGN
CHECK: l_paren: (
CHECK: number: 64
CHECK: slash: /
CHECK: number: 8
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: _end
CHECK: equal: =
CHECK: identifier: .
CHECK: semicolon: ;
CHECK: kw_provide: PROVIDE
CHECK: l_paren: (
CHECK: identifier: end
CHECK: equal: =
CHECK: identifier: .
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: identifier: .
CHECK: equal: =
CHECK: identifier: DATA_SEGMENT_END
CHECK: l_paren: (
CHECK: identifier: .
CHECK: r_paren: )
CHECK: semicolon: ;
CHECK: kw_discard: /DISCARD/
CHECK: colon: :
CHECK: l_brace: {
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .note.GNU-stack
CHECK: r_paren: )
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .gnu_debuglink
CHECK: r_paren: )
CHECK: star: *
CHECK: l_paren: (
CHECK: identifier: .gnu.lto_*
CHECK: r_paren: )
CHECK: r_brace: }
CHECK: r_brace: }
CHECK: eof:
CHECK: SEARCH_DIR("/usr/x86_64-linux-gnu/lib64")
CHECK: SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu")
CHECK: SECTIONS
CHECK: {
CHECK: PROVIDE(__executable_start = SEGMENT_START(text-segment, 4194304))
CHECK: . = (SEGMENT_START(text-segment, 4194304) + SIZEOF_HEADERS)
CHECK: .interp :
CHECK: {
CHECK: *(.interp)
CHECK: }
CHECK: .note.gnu.build-id :
CHECK: {
CHECK: *(.note.gnu.build-id)
CHECK: }
CHECK: .hash :
CHECK: {
CHECK: *(.hash)
CHECK: }
CHECK: .rela.dyn :
CHECK: {
CHECK: *(.rela.init)
CHECK: *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
CHECK: *(.rela.fini)
CHECK: *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
CHECK: }
CHECK: .rela.plt :
CHECK: {
CHECK: *(.rela.plt)
CHECK: PROVIDE_HIDDEN(__rela_iplt_start = .)
CHECK: *(.rela.iplt)
CHECK: PROVIDE_HIDDEN(__rela_iplt_end = .)
CHECK: }
CHECK: .init :
CHECK: {
CHECK: FILL(0x90909090)
CHECK: KEEP(*(SORT_NONE(.init)))
CHECK: } =0x909090909090909090909090
CHECK: PROVIDE(__etext = .)
CHECK: .eh_frame :
CHECK: ONLY_IF_RO {
CHECK: KEEP(*(.eh_frame))
CHECK: }
CHECK: .exception_ranges :
CHECK: ONLY_IF_RO {
CHECK: *(.exception_ranges .exception_ranges*)
CHECK: }
CHECK: . = (ALIGN(CONSTANT(MAXPAGESIZE)) - ((CONSTANT(MAXPAGESIZE) - .) & (CONSTANT(MAXPAGESIZE) - 1)))
CHECK: . = DATA_SEGMENT_ALIGN(CONSTANT(MAXPAGESIZE), CONSTANT(COMMONPAGESIZE))
CHECK: .eh_frame :
CHECK: ONLY_IF_RW {
CHECK: KEEP(*(.eh_frame))
CHECK: }
CHECK: .ctors :
CHECK: {
CHECK: KEEP(*crtbegin.o(.ctors))
CHECK: KEEP(*crtbegin?.o(.ctors))
CHECK: KEEP(*(EXCLUDE_FILE(*crtend.o *crtend?.o ) .ctors))
CHECK: KEEP(*(SORT_BY_NAME(.ctors.*)))
CHECK: KEEP(*(.ctors))
CHECK: }
CHECK: .dtors :
CHECK: {
CHECK: KEEP(*crtbegin.o(.dtors))
CHECK: KEEP(*crtbegin?.o(.dtors))
CHECK: KEEP(*(EXCLUDE_FILE(*crtend.o *crtend?.o ) .dtors))
CHECK: KEEP(*(SORT_BY_NAME(.dtors.*)))
CHECK: KEEP(*(.dtors))
CHECK: }
CHECK: . = DATA_SEGMENT_RELRO_END((SIZEOF(.got.plt) >= 24) ? 24 : 0, .)
CHECK: .got.plt :
CHECK: {
CHECK: *(.got.plt)
CHECK: *(.igot.plt)
CHECK: }
CHECK: .lrodata (ALIGN(CONSTANT(MAXPAGESIZE)) + (. & (CONSTANT(MAXPAGESIZE) - 1))) :
CHECK: {
CHECK: *(.lrodata .lrodata.* .gnu.linkonce.lr.*)
CHECK: }
CHECK: .ldata (ALIGN(CONSTANT(MAXPAGESIZE)) + (. & (CONSTANT(MAXPAGESIZE) - 1))) :
CHECK: {
CHECK: *(.ldata .ldata.* .gnu.linkonce.l.*)
CHECK: . = ALIGN((. != 0) ? (64 / 8) : 1)
CHECK: }
CHECK: . = ALIGN((64 / 8))
CHECK: _end = .
CHECK: PROVIDE(end = .)
CHECK: . = DATA_SEGMENT_END(.)
CHECK: :
CHECK: {
CHECK: *(.note.GNU-stack)
CHECK: *(.gnu_debuglink)
CHECK: *(.gnu.lto_*)
CHECK: }
CHECK: }
*/