| /* 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 |