123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #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
- #pragma GCC visibility push(default)
- #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
- };
- static int ret = 1;
- int print_status() {
- fprintf(stderr, "%s\n", ret ? "FAIL" : "PASS");
- return ret;
- }
- /* On ARM, this creates a .tbss section before .init_array, which
- * elfhack could then pick instead of .init_array.
- * Also, when .tbss is big enough, elfhack may wrongfully consider
- * following sections as part of the PT_TLS segment.
- * Finally, gold makes TLS segments end on an aligned virtual address,
- * even when the underlying section ends before that, and elfhack
- * sanity checks may yield an error. */
- __thread int foo;
- __thread long long int bar[512];
- void end_test() {
- static int count = 0;
- /* Only exit when both constructors have been called */
- if (++count == 2)
- ret = 0;
- }
- void test() {
- int i = 0, j = 0;
- #define DEF_(a,i,w) \
- if (a[i++] != str_ ## w) return;
- #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();
- }
- #pragma GCC visibility pop
- #endif
|