gecko-dev/build/unix/elfhack/test.c

149 lines
2.3 KiB
C

#ifdef DEF
DEF(This)
DEF(is)
DEF(a)
DEF(test)
DEF(of)
DEF(string)
DEF(array)
DEF(for)
DEF(use)
DEF(with)
DEF(elfhack)
DEF(to)
DEF(see)
DEF(whether)
DEF(it)
DEF(breaks)
DEF(anything)
DEF(but)
DEF(one)
DEF(needs)
DEF(quite)
DEF(some)
DEF(strings)
DEF(before)
DEF(the)
DEF(program)
DEF(can)
DEF(do)
DEF(its)
DEF(work)
DEF(efficiently)
DEF(Without)
DEF(enough)
DEF(data)
DEF(relocation)
DEF(sections)
DEF(are)
DEF(not)
DEF(sufficiently)
DEF(large)
DEF(and)
DEF(injected)
DEF(code)
DEF(wouldnt)
DEF(fit)
DEF(Said)
DEF(otherwise)
DEF(we)
DEF(need)
DEF(more)
DEF(words)
DEF(than)
DEF(up)
DEF(here)
DEF(so)
DEF(that)
DEF(relocations)
DEF(take)
DEF(significant)
DEF(bytes)
DEF(amounts)
DEF(which)
DEF(isnt)
DEF(exactly)
DEF(easily)
DEF(achieved)
DEF(like)
DEF(this)
DEF(Actually)
DEF(I)
DEF(must)
DEF(cheat)
DEF(by)
DEF(including)
DEF(these)
DEF(phrases)
DEF(several)
DEF(times)
#else
#include <stdlib.h>
#include <stdio.h>
#define DEF(w) static const char str_ ## w[] = #w;
#include "test.c"
#undef DEF
const char *strings[] = {
#define DEF(w) str_ ## w,
#include "test.c"
#include "test.c"
#include "test.c"
};
/* Create a hole between two zones of relative relocations */
const int hole[] = {
42, 42, 42, 42
};
const char *strings2[] = {
#include "test.c"
#include "test.c"
#include "test.c"
#include "test.c"
#include "test.c"
#undef DEF
};
/* On ARM, this creates a .tbss section before .init_array, which
* elfhack could then pick instead of .init_array */
__thread int foo;
__attribute__((constructor)) void end_test() {
static int count = 0;
/* Only exit when both constructors have been called */
if (++count == 2) {
fprintf(stderr, "PASS\n");
exit(0);
}
}
__attribute__((constructor)) void test() {
int i = 0, j = 0;
#define DEF_(a,i,w) \
if (a[i++] != str_ ## w) { \
fprintf(stderr, "FAIL\n"); \
exit(1); \
}
#define DEF(w) DEF_(strings,i,w)
#include "test.c"
#include "test.c"
#include "test.c"
#undef DEF
#define DEF(w) DEF_(strings2,j,w)
#include "test.c"
#include "test.c"
#include "test.c"
#include "test.c"
#include "test.c"
#undef DEF
if (i != sizeof(strings)/sizeof(strings[0]) &&
j != sizeof(strings2)/sizeof(strings2[0]))
fprintf(stderr, "WARNING: Test doesn't cover the whole array\n");
end_test();
}
#endif