# This reproduces a bug with BOLT non-reloc mode, during emission, if the user # does not use -update-debug-sections. In this bug, if a function gets too large # to occupy its original location, but it has a jump table, BOLT would skip # rewriting the function but it would still overwrite the jump table in a bogus # file offset (offset zero). This will typically corrupt the .interp section, # which is the first section in the binary, depending on the size of the jump # table that was written. If .interp is corrupted, the binary won't run. # REQUIRES: system-linux # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o # RUN: llvm-strip --strip-unneeded %t.o # RUN: %clang %cflags -no-pie -nostartfiles -nostdlib -lc %t.o -o %t.exe # RUN: llvm-bolt %t.exe -o %t.exe.bolt --relocs=0 --lite=0 \ # RUN: --reorder-blocks=reverse # RUN: %t.exe.bolt 1 2 3 .file "test.S" .text .globl _start .type _start, @function _start: .cfi_startproc xor %rax,%rax movq (%rsp), %rdi and $0x3,%rdi jmpq *.JT1(,%rdi,8) .LBB1: movl $0x1,%eax jmp .LBB5 .LBB2: movl $0x2,%eax jmp .LBB5 .LBB3: movl $0x3,%eax jmp .LBB5 .LBB4: movl $0x4,%eax .LBB5: callq exit@PLT .cfi_endproc .size _start, .-_start # Make the jump table large enough to force the bug to manifest as .interp # being corrupt. Typically .interp will be at offset 0x1c8, so the jump table # needs to be larger than that. .section .rodata,"a",@progbits .p2align 3 .JT1: .quad .LBB1 .quad .LBB2 .quad .LBB3 .quad .LBB4 .quad .LBB5 .quad .LBB5 .rept 100 .quad .LBB1 .endr