/* 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 : { 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_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: 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: } */