#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();
}