| # REQUIRES: x86 |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t |
| # Simple symbol assignment within input section list. The '.' symbol |
| # is not location counter but offset from the beginning of output |
| # section .foo |
| # RUN: echo "SECTIONS { \ |
| # RUN: . = SIZEOF_HEADERS; \ |
| # RUN: .foo : { \ |
| # RUN: begin_foo = .; \ |
| # RUN: PROVIDE(_begin_sec = .); \ |
| # RUN: *(.foo) \ |
| # RUN: end_foo = .; \ |
| # RUN: PROVIDE_HIDDEN(_end_sec = .); \ |
| # RUN: PROVIDE(_end_sec_abs = ABSOLUTE(.)); \ |
| # RUN: size_foo_1 = SIZEOF(.foo); \ |
| # RUN: size_foo_1_abs = ABSOLUTE(SIZEOF(.foo)); \ |
| # RUN: . = ALIGN(0x1000); \ |
| # RUN: begin_bar = .; \ |
| # RUN: *(.bar) \ |
| # RUN: end_bar = .; \ |
| # RUN: size_foo_2 = SIZEOF(.foo); } \ |
| # RUN: size_foo_3 = SIZEOF(.foo); \ |
| # RUN: .eh_frame_hdr : { \ |
| # RUN: __eh_frame_hdr_start = .; \ |
| # RUN: __eh_frame_hdr_start2 = ABSOLUTE(ALIGN(0x10)); \ |
| # RUN: *(.eh_frame_hdr) \ |
| # RUN: __eh_frame_hdr_end = .; \ |
| # RUN: __eh_frame_hdr_end2 = ABSOLUTE(ALIGN(0x10)); } \ |
| # RUN: .eh_frame : { } \ |
| # RUN: }" > %t.script |
| # RUN: ld.lld -o %t1 --eh-frame-hdr --script %t.script %t |
| # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=SIMPLE %s |
| |
| # Check that the following script is processed without errors |
| # RUN: echo "SECTIONS { \ |
| # RUN: .eh_frame_hdr : { \ |
| # RUN: PROVIDE_HIDDEN(_begin_sec = .); \ |
| # RUN: *(.eh_frame_hdr) \ |
| # RUN: *(.eh_frame_hdr) \ |
| # RUN: PROVIDE_HIDDEN(_end_sec_abs = ABSOLUTE(.)); \ |
| # RUN: PROVIDE_HIDDEN(_end_sec = .); } \ |
| # RUN: }" > %t.script |
| # RUN: ld.lld -o %t1 --eh-frame-hdr --script %t.script %t |
| |
| # Check that we can specify synthetic symbols without defining SECTIONS. |
| # RUN: echo "PROVIDE_HIDDEN(_begin_sec = _start); \ |
| # RUN: PROVIDE_HIDDEN(_end_sec = ADDR(.text) + SIZEOF(.text));" > %t.script |
| # RUN: ld.lld -o %t1 --eh-frame-hdr --script %t.script %t |
| # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=NO-SEC %s |
| |
| # Check that we can do the same as above inside SECTIONS block. |
| # RUN: echo "SECTIONS { \ |
| # RUN: . = 0x201000; \ |
| # RUN: .text : { *(.text) } \ |
| # RUN: PROVIDE_HIDDEN(_begin_sec = ADDR(.text)); \ |
| # RUN: PROVIDE_HIDDEN(_end_sec = ADDR(.text) + SIZEOF(.text)); }" > %t.script |
| # RUN: ld.lld -o %t1 --eh-frame-hdr --script %t.script %t |
| # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=IN-SEC %s |
| |
| # SIMPLE: 0000000000000128 .foo 00000000 .hidden _end_sec |
| # SIMPLE-NEXT: 0000000000000120 .foo 00000000 _begin_sec |
| # SIMPLE-NEXT: 0000000000000128 *ABS* 00000000 _end_sec_abs |
| # SIMPLE-NEXT: 0000000000001048 .text 00000000 _start |
| # SIMPLE-NEXT: 0000000000000120 .foo 00000000 begin_foo |
| # SIMPLE-NEXT: 0000000000000128 .foo 00000000 end_foo |
| # SIMPLE-NEXT: 0000000000000008 *ABS* 00000000 size_foo_1 |
| # SIMPLE-NEXT: 0000000000000008 *ABS* 00000000 size_foo_1_abs |
| # SIMPLE-NEXT: 0000000000001000 .foo 00000000 begin_bar |
| # SIMPLE-NEXT: 0000000000001004 .foo 00000000 end_bar |
| # SIMPLE-NEXT: 0000000000000ee4 *ABS* 00000000 size_foo_2 |
| # SIMPLE-NEXT: 0000000000000ee4 *ABS* 00000000 size_foo_3 |
| # SIMPLE-NEXT: 0000000000001004 .eh_frame_hdr 00000000 __eh_frame_hdr_start |
| # SIMPLE-NEXT: 0000000000001010 *ABS* 00000000 __eh_frame_hdr_start2 |
| # SIMPLE-NEXT: 0000000000001018 .eh_frame_hdr 00000000 __eh_frame_hdr_end |
| # SIMPLE-NEXT: 0000000000001020 *ABS* 00000000 __eh_frame_hdr_end2 |
| |
| # NO-SEC: 0000000000201000 .text 00000000 .hidden _begin_sec |
| # NO-SEC-NEXT: 0000000000201001 .text 00000000 .hidden _end_sec |
| |
| # IN-SEC: 0000000000201000 .text 00000000 .hidden _begin_sec |
| # IN-SEC-NEXT: 0000000000201001 .text 00000000 .hidden _end_sec |
| |
| .global _start |
| _start: |
| nop |
| |
| .section .foo,"a" |
| .quad 0 |
| |
| .section .bar,"a" |
| .long 0 |
| |
| .section .dah,"ax",@progbits |
| .cfi_startproc |
| nop |
| .cfi_endproc |
| |
| .global _begin_sec, _end_sec, _end_sec_abs |