| # REQUIRES: ppc | |
| # RUN: rm -rf %t && split-file %s %t | |
| # RUN: llvm-mc -filetype=obj -triple=powerpc64le %t/a.s -o %t/a.o | |
| # RUN: llvm-mc -filetype=obj -triple=powerpc64le %p/Inputs/shared.s -o %t/b.o | |
| # RUN: ld.lld -shared -soname=b %t/b.o -o %t/b.so | |
| # RUN: ld.lld -z max-page-size=65536 -z norelro %t/a.o %t/b.so -T %t/1.t -o %t/a1 | |
| # RN: llvm-readelf -S -l %t/a1 | FileCheck %s --check-prefixes=CHECK1 | |
| # RUN: ld.lld -z max-page-size=65536 -z relro %t/a.o %t/b.so -T %t/1.t -o %t/a2 | |
| # RUN: llvm-readelf -S -l %t/a2 | FileCheck %s --check-prefixes=CHECK2 | |
| ## -z norelro suppresses the .relro_padding section. | |
| # CHECK1: Name Type Address Off Size ES Flg | |
| # CHECK1: .foo PROGBITS | |
| # CHECK1-NEXT: .orphan.rw PROGBITS | |
| # CHECK1-NEXT: .branch_lt PROGBITS | |
| # CHECK1-NEXT: .got PROGBITS | |
| # CHECK1-NEXT: .data PROGBITS | |
| # CHECK1-NEXT: .bss NOBITS | |
| # CHECK2: Name Type Address Off Size ES Flg | |
| # CHECK2-NEXT: NULL {{.*}} | |
| # CHECK2: .orphan.ro PROGBITS {{.*}} A | |
| # CHECK2: .dynamic DYNAMIC {{.*}} WA | |
| # CHECK2-NEXT: .branch_lt PROGBITS {{.*}} WA | |
| # CHECK2-NEXT: .got PROGBITS {{.*}} WA | |
| # CHECK2-NEXT: .relro_padding NOBITS 00000000000100f0 0100f0 000f10 00 WA | |
| # CHECK2-NEXT: .data PROGBITS {{.*}} WA | |
| # CHECK2-NEXT: .foo PROGBITS {{.*}} WA | |
| # CHECK2-NEXT: .orphan.rw PROGBITS {{.*}} WA | |
| # CHECK2-NEXT: .bss NOBITS {{.*}} WA | |
| #--- a.s | |
| .global _start | |
| _start: | |
| addis 3, 2, bar2@toc@ha | |
| ld 12, bar2@toc@l(3) | |
| mtctr 12 | |
| bctrl | |
| b bar | |
| nop | |
| .section .data,"aw" | |
| .quad 0 | |
| .zero 4 | |
| .section .foo,"aw" | |
| .section .bss,"",@nobits | |
| .section .orphan.ro,"a",@progbits | |
| .dc.a 0 | |
| .section .orphan.rw,"aw",@progbits | |
| .dc.a .orphan.rw | |
| #--- 1.t | |
| SECTIONS { | |
| . = SIZEOF_HEADERS; | |
| .plt : { *(.plt) } | |
| .text : { *(.text) } | |
| . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); | |
| .dynamic : { *(.dynamic) } | |
| .branch_lt : { *(.branch_lt) } | |
| .got : { *(.got) } | |
| . = DATA_SEGMENT_RELRO_END (0, .); | |
| .plt : { *(.plt) } | |
| .data : { *(.data) } | |
| .bss : { *(.bss) } | |
| . = DATA_SEGMENT_END (.); | |
| .comment 0 : { *(.comment) } | |
| } |