1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
#include <stdio.h>
// For the test case, we really want the the layout of this binary
// to be:
//
// foo()
// bar() - 4096 bytes of nop's
// main()
// "HI" string
//
// in reality getting this layout from the compiler and linker
// is a crapshoot, so I have yaml's checked in of the correct
// layout. Recompiling from source may not get the needed
// binary layout.
static int bar();
static int foo() { return 5 + bar(); }
// A function of 4096 bytes, so when main() loads the
// address of foo() before this one, it has to subtract
// a 4096 page.
#define SIXTY_FOUR_BYTES_NOP \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop");
static int bar() {
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
SIXTY_FOUR_BYTES_NOP;
return 5;
}
int main() {
int (*f)(void) = foo;
puts("HI");
return f();
}
|