
BOLT instrumented binary today has a readable (R), writeable (W) and also executable (X) segment, which Android system won't load due to its WX attribute. Such RWX segment was produced because BOLT has a two step linking, first for everything in the updated or rewritten input binary and next for runtime library. Each linking will layout sections in the order of RX sections followed by RO sections and then followed by RW sections. So we could end up having a RW section `.bolt.instr.counters` surrounded by a number of RO and RX sections, and a new text segment was then formed by including all RX sections which includes the RW section in the middle, and hence the RWX segment. One way to fix this is to separate the RW `.bolt.instr.counters` section into its own segment by a). assigning the starting addresses for section `.bolt.instr.counters` and its following section with regular page aligned addresses and b). creating two extra program headers accordingly.
16 lines
554 B
C
16 lines
554 B
C
// Test bolt instrumentation won't generate a binary with any segment that
|
|
// is writable and executable. Basically we want to put `.bolt.instr.counters`
|
|
// section into its own segment, separated from its surrounding RX sections.
|
|
|
|
// REQUIRES: system-linux
|
|
|
|
void foo() {}
|
|
void bar() { foo(); }
|
|
|
|
// RUN: %clang %cflags -c %s -o %t.o
|
|
// RUN: ld.lld -q -o %t.so %t.o -shared --init=foo --fini=foo
|
|
// RUN: llvm-bolt --instrument %t.so -o %tt.so
|
|
// RUN: llvm-readelf -l %tt.so | FileCheck %s
|
|
// CHECK-NOT: RWE
|
|
// CHECK: {{[0-9]*}} .bolt.instr.counters {{$}}
|