diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch | 550 |
1 files changed, 550 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch b/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch new file mode 100644 index 0000000000..cad13d1228 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch | |||
@@ -0,0 +1,550 @@ | |||
1 | 2004-11-27 Jakub Jelinek <jakub@redhat.com> | ||
2 | |||
3 | * config.gcc (ia64*-*-linux*): If native and libelf is installed, | ||
4 | use ia64/t-glibc-no-libunwind instead of the other t-*unwind* | ||
5 | fragments. | ||
6 | * config/ia64/t-glibc-no-libunwind: New file. | ||
7 | * config/ia64/change-symver.c: New file. | ||
8 | * config/ia64/unwind-ia64.c: If USE_SYMVER_GLOBAL and SHARED, | ||
9 | define _Unwind_* to __symverglobal_Unwind_*. | ||
10 | (alias): Undefine. | ||
11 | (symverglobal): Define. Use it on _Unwind_*. | ||
12 | * config/ia64/mkmap-symver-multi.awk: New file. | ||
13 | * config/ia64/libgcc-ia64-no-libunwind.ver: New file. | ||
14 | |||
15 | Index: gcc/config.gcc | ||
16 | =================================================================== | ||
17 | --- gcc/config.gcc.orig 2010-04-07 03:34:00.000000000 -0700 | ||
18 | +++ gcc/config.gcc 2010-06-25 10:15:25.133131055 -0700 | ||
19 | @@ -1457,9 +1457,16 @@ | ||
20 | ;; | ||
21 | ia64*-*-linux*) | ||
22 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h glibc-stdint.h ia64/sysv4.h ia64/linux.h" | ||
23 | - tmake_file="${tmake_file} ia64/t-ia64 t-libunwind ia64/t-glibc" | ||
24 | - if test x$with_system_libunwind != xyes ; then | ||
25 | - tmake_file="${tmake_file} t-libunwind-elf ia64/t-glibc-libunwind" | ||
26 | + tmake_file="${tmake_file} ia64/t-ia64" | ||
27 | + if test x${target} = x${host} && test x${target} = x${build} \ | ||
28 | + && grep gelf_getverdef /usr/include/gelf.h > /dev/null 2>&1 \ | ||
29 | + && test -f /usr/lib/libelf.so; then | ||
30 | + tmake_file="${tmake_file} ia64/t-glibc-no-libunwind" | ||
31 | + else | ||
32 | + tmake_file="${tmake_file} t-libunwind ia64/t-glibc" | ||
33 | + if test x$with_system_libunwind != xyes ; then | ||
34 | + tmake_file="${tmake_file} t-libunwind-elf ia64/t-glibc-libunwind" | ||
35 | + fi | ||
36 | fi | ||
37 | target_cpu_default="MASK_GNU_AS|MASK_GNU_LD" | ||
38 | extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o" | ||
39 | Index: gcc/config/ia64/t-glibc-no-libunwind | ||
40 | =================================================================== | ||
41 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
42 | +++ gcc/config/ia64/t-glibc-no-libunwind 2010-06-25 10:14:32.521880765 -0700 | ||
43 | @@ -0,0 +1,30 @@ | ||
44 | +# Don't use system libunwind library on IA-64 GLIBC based system, | ||
45 | +# but make _Unwind_* symbols unversioned, so that created programs | ||
46 | +# are usable even when libgcc_s uses libunwind. | ||
47 | +LIB2ADDEH += $(srcdir)/config/ia64/fde-glibc.c | ||
48 | +SHLIB_MAPFILES += $(srcdir)/config/ia64/libgcc-ia64-no-libunwind.ver | ||
49 | +SHLIB_MKMAP = $(srcdir)/config/ia64/mkmap-symver-multi.awk | ||
50 | + | ||
51 | +SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ | ||
52 | + -Wl,--soname=$(SHLIB_SONAME) \ | ||
53 | + -Wl,--version-script=$(SHLIB_MAP) \ | ||
54 | + -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \ | ||
55 | + rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \ | ||
56 | + if [ -f $(SHLIB_DIR)/$(SHLIB_SONAME) ]; then \ | ||
57 | + mv -f $(SHLIB_DIR)/$(SHLIB_SONAME) \ | ||
58 | + $(SHLIB_DIR)/$(SHLIB_SONAME).backup; \ | ||
59 | + else true; fi && \ | ||
60 | + gcc -O2 -o $(SHLIB_DIR)/$(SHLIB_SONAME).tweak \ | ||
61 | + $$(gcc_srcdir)/config/ia64/change-symver.c -lelf && \ | ||
62 | + $(SHLIB_DIR)/$(SHLIB_SONAME).tweak $(SHLIB_DIR)/$(SHLIB_SONAME).tmp \ | ||
63 | + GCC_3.4.2 _GLOBAL_ \ | ||
64 | + _Unwind_GetGR _Unwind_RaiseException _Unwind_GetRegionStart _Unwind_SetIP \ | ||
65 | + _Unwind_GetIP _Unwind_GetLanguageSpecificData _Unwind_Resume \ | ||
66 | + _Unwind_DeleteException _Unwind_SetGR _Unwind_ForcedUnwind \ | ||
67 | + _Unwind_Backtrace _Unwind_FindEnclosingFunction _Unwind_GetCFA \ | ||
68 | + _Unwind_Resume_or_Rethrow _Unwind_GetBSP && \ | ||
69 | + rm -f $(SHLIB_DIR)/$(SHLIB_SONAME).tweak && \ | ||
70 | + mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \ | ||
71 | + $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK) | ||
72 | + | ||
73 | +TARGET_LIBGCC2_CFLAGS += -DUSE_SYMVER_GLOBAL | ||
74 | Index: gcc/config/ia64/change-symver.c | ||
75 | =================================================================== | ||
76 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
77 | +++ gcc/config/ia64/change-symver.c 2010-06-25 10:14:32.521880765 -0700 | ||
78 | @@ -0,0 +1,211 @@ | ||
79 | +#define _GNU_SOURCE 1 | ||
80 | +#define _FILE_OFFSET_BITS 64 | ||
81 | +#include <endian.h> | ||
82 | +#include <errno.h> | ||
83 | +#include <error.h> | ||
84 | +#include <fcntl.h> | ||
85 | +#include <fnmatch.h> | ||
86 | +#include <gelf.h> | ||
87 | +#include <stdlib.h> | ||
88 | +#include <string.h> | ||
89 | +#include <unistd.h> | ||
90 | + | ||
91 | +int | ||
92 | +compute_veridx (const char *name, Elf *elf, Elf_Data *verd, GElf_Shdr *verd_shdr) | ||
93 | +{ | ||
94 | + if (strcmp (name, "_GLOBAL_") == 0) | ||
95 | + return 1; | ||
96 | + | ||
97 | + int cnt; | ||
98 | + size_t offset = 0; | ||
99 | + for (cnt = verd_shdr->sh_info; --cnt >= 0; ) | ||
100 | + { | ||
101 | + GElf_Verdef defmem; | ||
102 | + GElf_Verdef *def; | ||
103 | + GElf_Verdaux auxmem; | ||
104 | + GElf_Verdaux *aux; | ||
105 | + unsigned int auxoffset; | ||
106 | + | ||
107 | + /* Get the data at the next offset. */ | ||
108 | + def = gelf_getverdef (verd, offset, &defmem); | ||
109 | + if (def == NULL) | ||
110 | + break; | ||
111 | + | ||
112 | + auxoffset = offset + def->vd_aux; | ||
113 | + aux = gelf_getverdaux (verd, auxoffset, &auxmem); | ||
114 | + if (aux == NULL) | ||
115 | + break; | ||
116 | + | ||
117 | + if (strcmp (name, elf_strptr (elf, verd_shdr->sh_link, | ||
118 | + aux->vda_name)) == 0) | ||
119 | + return def->vd_ndx; | ||
120 | + | ||
121 | + /* Find the next offset. */ | ||
122 | + offset += def->vd_next; | ||
123 | + } | ||
124 | + | ||
125 | + return -1; | ||
126 | +} | ||
127 | + | ||
128 | +int | ||
129 | +main (int argc, char **argv) | ||
130 | +{ | ||
131 | + if (argc < 4) | ||
132 | + error (1, 0, "Usage: change_symver library from_symver to_symver symbol...\nExample: change_symver libfoo.so FOO_1.0 *global* bar baz"); | ||
133 | + | ||
134 | + const char *fname = argv[1]; | ||
135 | + | ||
136 | + /* Open the file. */ | ||
137 | + int fd; | ||
138 | + fd = open (fname, O_RDWR); | ||
139 | + if (fd == -1) | ||
140 | + error (1, errno, fname); | ||
141 | + | ||
142 | + elf_version (EV_CURRENT); | ||
143 | + | ||
144 | + /* Now get the ELF descriptor. */ | ||
145 | + Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL); | ||
146 | + if (elf == NULL || elf_kind (elf) != ELF_K_ELF) | ||
147 | + error (1, 0, "Couldn't open %s: %s", fname, elf_errmsg (-1)); | ||
148 | + | ||
149 | + size_t shstrndx; | ||
150 | + /* Get the section header string table index. */ | ||
151 | + if (elf_getshstrndx (elf, &shstrndx) < 0) | ||
152 | + error (1, 0, "cannot get shstrndx from %s", fname); | ||
153 | + | ||
154 | + GElf_Ehdr ehdr_mem; | ||
155 | + GElf_Ehdr *ehdr; | ||
156 | + | ||
157 | + /* We need the ELF header in a few places. */ | ||
158 | + ehdr = gelf_getehdr (elf, &ehdr_mem); | ||
159 | + if (ehdr == NULL) | ||
160 | + error (1, 0, "couldn't get ELF headers %s: %s", fname, elf_errmsg (-1)); | ||
161 | + | ||
162 | + Elf_Scn *scn = NULL; | ||
163 | + GElf_Shdr shdr_mem, verd_shdr, ver_shdr, dynsym_shdr; | ||
164 | + Elf_Data *ver = NULL, *verd = NULL, *dynsym = NULL; | ||
165 | + | ||
166 | + while ((scn = elf_nextscn (elf, scn)) != NULL) | ||
167 | + { | ||
168 | + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); | ||
169 | + | ||
170 | + if (shdr == NULL) | ||
171 | + error (1, 0, "couldn't get shdr from %s", fname); | ||
172 | + | ||
173 | + if ((shdr->sh_flags & SHF_ALLOC) != 0) | ||
174 | + { | ||
175 | + const char *name = elf_strptr (elf, shstrndx, shdr->sh_name); | ||
176 | + Elf_Data **p; | ||
177 | + | ||
178 | + if (strcmp (name, ".gnu.version") == 0) | ||
179 | + { | ||
180 | + p = &ver; | ||
181 | + ver_shdr = *shdr; | ||
182 | + } | ||
183 | + else if (strcmp (name, ".gnu.version_d") == 0) | ||
184 | + { | ||
185 | + p = &verd; | ||
186 | + verd_shdr = *shdr; | ||
187 | + } | ||
188 | + else if (strcmp (name, ".dynsym") == 0) | ||
189 | + { | ||
190 | + p = &dynsym; | ||
191 | + dynsym_shdr = *shdr; | ||
192 | + } | ||
193 | + else | ||
194 | + continue; | ||
195 | + | ||
196 | + if (*p != NULL) | ||
197 | + error (1, 0, "Two %s sections in %s", name, fname); | ||
198 | + *p = elf_getdata (scn, NULL); | ||
199 | + if (*p == NULL || elf_getdata (scn, *p) != NULL) | ||
200 | + error (1, 0, "No data or non-contiguous data in %s section in %s", | ||
201 | + name, fname); | ||
202 | + } | ||
203 | + } | ||
204 | + | ||
205 | + if (ver == NULL || verd == NULL || dynsym == NULL) | ||
206 | + error (1, 0, "Couldn't find one of the needed sections in %s", fname); | ||
207 | + | ||
208 | + int from_idx = compute_veridx (argv[2], elf, verd, &verd_shdr); | ||
209 | + if (from_idx == -1) | ||
210 | + error (1, 0, "Could not find symbol version %s in %s", argv[2], fname); | ||
211 | + | ||
212 | + int to_idx = compute_veridx (argv[3], elf, verd, &verd_shdr); | ||
213 | + if (to_idx == -1) | ||
214 | + error (1, 0, "Could not find symbol version %s in %s", argv[3], fname); | ||
215 | + | ||
216 | + if (dynsym_shdr.sh_entsize != gelf_fsize (elf, ELF_T_SYM, 1, ehdr->e_version) | ||
217 | + || dynsym_shdr.sh_size % dynsym_shdr.sh_entsize | ||
218 | + || ver_shdr.sh_entsize != 2 | ||
219 | + || (ver_shdr.sh_size & 1) | ||
220 | + || dynsym_shdr.sh_size / dynsym_shdr.sh_entsize != ver_shdr.sh_size / 2) | ||
221 | + error (1, 0, "Unexpected sh_size or sh_entsize in %s", fname); | ||
222 | + | ||
223 | + size_t nentries = ver_shdr.sh_size / 2; | ||
224 | + size_t cnt; | ||
225 | + GElf_Versym array[nentries]; | ||
226 | + for (cnt = 0; cnt < nentries; ++cnt) | ||
227 | + { | ||
228 | + GElf_Versym vsymmem; | ||
229 | + GElf_Versym *vsym; | ||
230 | + | ||
231 | + vsym = gelf_getversym (ver, cnt, &vsymmem); | ||
232 | + if (vsym == NULL) | ||
233 | + error (1, 0, "gelt_getversym failed in %s: %s", fname, elf_errmsg (-1)); | ||
234 | + | ||
235 | + array[cnt] = *vsym; | ||
236 | + if (*vsym != from_idx) | ||
237 | + continue; | ||
238 | + | ||
239 | + GElf_Sym sym_mem; | ||
240 | + GElf_Sym *sym; | ||
241 | + sym = gelf_getsym (dynsym, cnt, &sym_mem); | ||
242 | + if (sym == NULL) | ||
243 | + error (1, 0, "gelt_getsym failed in %s: %s", fname, elf_errmsg (-1)); | ||
244 | + | ||
245 | + const char *name = elf_strptr (elf, dynsym_shdr.sh_link, sym->st_name); | ||
246 | + | ||
247 | + int argn; | ||
248 | + for (argn = 4; argn < argc; ++argn) | ||
249 | + if (fnmatch (argv[argn], name, 0) == 0) | ||
250 | + { | ||
251 | + array[cnt] = to_idx; | ||
252 | + break; | ||
253 | + } | ||
254 | + } | ||
255 | + | ||
256 | + if (sizeof (array[0]) != 2) | ||
257 | + abort (); | ||
258 | + | ||
259 | +#if __BYTE_ORDER == __LITTLE_ENDIAN | ||
260 | + if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) | ||
261 | + ; | ||
262 | + else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) | ||
263 | +#elif __BYTE_ORDER == __BIG_ENDIAN | ||
264 | + if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) | ||
265 | + ; | ||
266 | + else if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) | ||
267 | +#else | ||
268 | +# error Unsupported endianity | ||
269 | +#endif | ||
270 | + { | ||
271 | + for (cnt = 0; cnt < nentries; ++cnt) | ||
272 | + array[cnt] = ((array[cnt] & 0xff) << 8) | ((array[cnt] & 0xff00) >> 8); | ||
273 | + } | ||
274 | + else | ||
275 | + error (1, 0, "Unknown EI_DATA %d in %s", ehdr->e_ident[EI_DATA], fname); | ||
276 | + | ||
277 | + if (elf_end (elf) != 0) | ||
278 | + error (1, 0, "couldn't close %s: %s", fname, elf_errmsg (-1)); | ||
279 | + | ||
280 | + if (lseek (fd, ver_shdr.sh_offset, SEEK_SET) != (off_t) ver_shdr.sh_offset) | ||
281 | + error (1, 0, "failed to seek to %zd in %s", (size_t) ver_shdr.sh_offset, | ||
282 | + fname); | ||
283 | + | ||
284 | + if (write (fd, array, 2 * nentries) != (ssize_t) (2 * nentries)) | ||
285 | + error (1, 0, "failed to write .gnu.version section into %s", fname); | ||
286 | + | ||
287 | + close (fd); | ||
288 | + return 0; | ||
289 | +} | ||
290 | Index: gcc/config/ia64/unwind-ia64.c | ||
291 | =================================================================== | ||
292 | --- gcc/config/ia64/unwind-ia64.c.orig 2009-09-07 08:41:52.000000000 -0700 | ||
293 | +++ gcc/config/ia64/unwind-ia64.c 2010-06-25 10:14:32.521880765 -0700 | ||
294 | @@ -48,6 +48,51 @@ | ||
295 | #define MD_UNW_COMPATIBLE_PERSONALITY_P(HEADER) 1 | ||
296 | #endif | ||
297 | |||
298 | +#if defined (USE_SYMVER_GLOBAL) && defined (SHARED) | ||
299 | +extern _Unwind_Reason_Code __symverglobal_Unwind_Backtrace | ||
300 | + (_Unwind_Trace_Fn, void *); | ||
301 | +extern void __symverglobal_Unwind_DeleteException | ||
302 | + (struct _Unwind_Exception *); | ||
303 | +extern void * __symverglobal_Unwind_FindEnclosingFunction (void *); | ||
304 | +extern _Unwind_Reason_Code __symverglobal_Unwind_ForcedUnwind | ||
305 | + (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); | ||
306 | +extern _Unwind_Word __symverglobal_Unwind_GetCFA | ||
307 | + (struct _Unwind_Context *); | ||
308 | +extern _Unwind_Word __symverglobal_Unwind_GetBSP | ||
309 | + (struct _Unwind_Context *); | ||
310 | +extern _Unwind_Word __symverglobal_Unwind_GetGR | ||
311 | + (struct _Unwind_Context *, int ); | ||
312 | +extern _Unwind_Ptr __symverglobal_Unwind_GetIP (struct _Unwind_Context *); | ||
313 | +extern void *__symverglobal_Unwind_GetLanguageSpecificData | ||
314 | + (struct _Unwind_Context *); | ||
315 | +extern _Unwind_Ptr __symverglobal_Unwind_GetRegionStart | ||
316 | + (struct _Unwind_Context *); | ||
317 | +extern _Unwind_Reason_Code __symverglobal_Unwind_RaiseException | ||
318 | + (struct _Unwind_Exception *); | ||
319 | +extern void __symverglobal_Unwind_Resume (struct _Unwind_Exception *); | ||
320 | +extern _Unwind_Reason_Code __symverglobal_Unwind_Resume_or_Rethrow | ||
321 | + (struct _Unwind_Exception *); | ||
322 | +extern void __symverglobal_Unwind_SetGR | ||
323 | + (struct _Unwind_Context *, int, _Unwind_Word); | ||
324 | +extern void __symverglobal_Unwind_SetIP | ||
325 | + (struct _Unwind_Context *, _Unwind_Ptr); | ||
326 | +#define _Unwind_Backtrace __symverglobal_Unwind_Backtrace | ||
327 | +#define _Unwind_DeleteException __symverglobal_Unwind_DeleteException | ||
328 | +#define _Unwind_FindEnclosingFunction __symverglobal_Unwind_FindEnclosingFunction | ||
329 | +#define _Unwind_ForcedUnwind __symverglobal_Unwind_ForcedUnwind | ||
330 | +#define _Unwind_GetBSP __symverglobal_Unwind_GetBSP | ||
331 | +#define _Unwind_GetCFA __symverglobal_Unwind_GetCFA | ||
332 | +#define _Unwind_GetGR __symverglobal_Unwind_GetGR | ||
333 | +#define _Unwind_GetIP __symverglobal_Unwind_GetIP | ||
334 | +#define _Unwind_GetLanguageSpecificData __symverglobal_Unwind_GetLanguageSpecificData | ||
335 | +#define _Unwind_GetRegionStart __symverglobal_Unwind_GetRegionStart | ||
336 | +#define _Unwind_RaiseException __symverglobal_Unwind_RaiseException | ||
337 | +#define _Unwind_Resume __symverglobal_Unwind_Resume | ||
338 | +#define _Unwind_Resume_or_Rethrow __symverglobal_Unwind_Resume_or_Rethrow | ||
339 | +#define _Unwind_SetGR __symverglobal_Unwind_SetGR | ||
340 | +#define _Unwind_SetIP __symverglobal_Unwind_SetIP | ||
341 | +#endif | ||
342 | + | ||
343 | enum unw_application_register | ||
344 | { | ||
345 | UNW_AR_BSP, | ||
346 | @@ -2457,4 +2502,44 @@ | ||
347 | alias (_Unwind_SetIP); | ||
348 | #endif | ||
349 | |||
350 | +#if defined (USE_SYMVER_GLOBAL) && defined (SHARED) | ||
351 | +#undef alias | ||
352 | +#define symverglobal(name, version) \ | ||
353 | +__typeof (__symverglobal##name) __symverlocal##name \ | ||
354 | + __attribute__ ((alias ("__symverglobal" #name))); \ | ||
355 | +__asm__ (".symver __symverglobal" #name"," #name "@@GCC_3.4.2");\ | ||
356 | +__asm__ (".symver __symverlocal" #name"," #name "@" #version) | ||
357 | + | ||
358 | +#undef _Unwind_Backtrace | ||
359 | +#undef _Unwind_DeleteException | ||
360 | +#undef _Unwind_FindEnclosingFunction | ||
361 | +#undef _Unwind_ForcedUnwind | ||
362 | +#undef _Unwind_GetBSP | ||
363 | +#undef _Unwind_GetCFA | ||
364 | +#undef _Unwind_GetGR | ||
365 | +#undef _Unwind_GetIP | ||
366 | +#undef _Unwind_GetLanguageSpecificData | ||
367 | +#undef _Unwind_GetRegionStart | ||
368 | +#undef _Unwind_RaiseException | ||
369 | +#undef _Unwind_Resume | ||
370 | +#undef _Unwind_Resume_or_Rethrow | ||
371 | +#undef _Unwind_SetGR | ||
372 | +#undef _Unwind_SetIP | ||
373 | +symverglobal (_Unwind_Backtrace, GCC_3.3); | ||
374 | +symverglobal (_Unwind_DeleteException, GCC_3.0); | ||
375 | +symverglobal (_Unwind_FindEnclosingFunction, GCC_3.3); | ||
376 | +symverglobal (_Unwind_ForcedUnwind, GCC_3.0); | ||
377 | +symverglobal (_Unwind_GetBSP, GCC_3.3.2); | ||
378 | +symverglobal (_Unwind_GetCFA, GCC_3.3); | ||
379 | +symverglobal (_Unwind_GetGR, GCC_3.0); | ||
380 | +symverglobal (_Unwind_GetIP, GCC_3.0); | ||
381 | +symverglobal (_Unwind_GetLanguageSpecificData, GCC_3.0); | ||
382 | +symverglobal (_Unwind_GetRegionStart, GCC_3.0); | ||
383 | +symverglobal (_Unwind_RaiseException, GCC_3.0); | ||
384 | +symverglobal (_Unwind_Resume, GCC_3.0); | ||
385 | +symverglobal (_Unwind_Resume_or_Rethrow, GCC_3.3); | ||
386 | +symverglobal (_Unwind_SetGR, GCC_3.0); | ||
387 | +symverglobal (_Unwind_SetIP, GCC_3.0); | ||
388 | +#endif | ||
389 | + | ||
390 | #endif | ||
391 | Index: gcc/config/ia64/mkmap-symver-multi.awk | ||
392 | =================================================================== | ||
393 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
394 | +++ gcc/config/ia64/mkmap-symver-multi.awk 2010-06-25 10:14:32.521880765 -0700 | ||
395 | @@ -0,0 +1,133 @@ | ||
396 | +# Generate an ELF symbol version map a-la Solaris and GNU ld. | ||
397 | +# Contributed by Richard Henderson <rth@cygnus.com> | ||
398 | +# | ||
399 | +# This file is part of GCC. | ||
400 | +# | ||
401 | +# GCC is free software; you can redistribute it and/or modify it under | ||
402 | +# the terms of the GNU General Public License as published by the Free | ||
403 | +# Software Foundation; either version 2, or (at your option) any later | ||
404 | +# version. | ||
405 | +# | ||
406 | +# GCC is distributed in the hope that it will be useful, but WITHOUT | ||
407 | +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
408 | +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public | ||
409 | +# License for more details. | ||
410 | +# | ||
411 | +# You should have received a copy of the GNU General Public License | ||
412 | +# along with GCC; see the file COPYING. If not, write to the Free | ||
413 | +# Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA | ||
414 | +# 02110-1301, USA. | ||
415 | + | ||
416 | +BEGIN { | ||
417 | + state = "nm"; | ||
418 | + sawsymbol = 0; | ||
419 | +} | ||
420 | + | ||
421 | +# Remove comment and blank lines. | ||
422 | +/^ *#/ || /^ *$/ { | ||
423 | + next; | ||
424 | +} | ||
425 | + | ||
426 | +# We begin with nm input. Collect the set of symbols that are present | ||
427 | +# so that we can not emit them into the final version script -- Solaris | ||
428 | +# complains at us if we do. | ||
429 | + | ||
430 | +state == "nm" && /^%%/ { | ||
431 | + state = "ver"; | ||
432 | + next; | ||
433 | +} | ||
434 | + | ||
435 | +state == "nm" && ($1 == "U" || $2 == "U") { | ||
436 | + next; | ||
437 | +} | ||
438 | + | ||
439 | +state == "nm" && NF == 3 { | ||
440 | + if ($3 ~ /^[^@]*@GCC_[0-9.]*$/) { | ||
441 | + def[$3] = 1 | ||
442 | + tl=$3 | ||
443 | + sub(/^.*@/,"",tl) | ||
444 | + ver[$3] = tl | ||
445 | + } else { | ||
446 | + sub(/@@?GCC_[0-9.]*$/,"",$3) | ||
447 | + def[$3] = 1; | ||
448 | + } | ||
449 | + sawsymbol = 1; | ||
450 | + next; | ||
451 | +} | ||
452 | + | ||
453 | +state == "nm" { | ||
454 | + next; | ||
455 | +} | ||
456 | + | ||
457 | +# Now we process a simplified variant of the Solaris symbol version | ||
458 | +# script. We have one symbol per line, no semicolons, simple markers | ||
459 | +# for beginning and ending each section, and %inherit markers for | ||
460 | +# describing version inheritence. A symbol may appear in more than | ||
461 | +# one symbol version, and the last seen takes effect. | ||
462 | + | ||
463 | +NF == 3 && $1 == "%inherit" { | ||
464 | + inherit[$2] = $3; | ||
465 | + next; | ||
466 | +} | ||
467 | + | ||
468 | +NF == 2 && $2 == "{" { | ||
469 | + libs[$1] = 1; | ||
470 | + thislib = $1; | ||
471 | + next; | ||
472 | +} | ||
473 | + | ||
474 | +$1 == "}" { | ||
475 | + thislib = ""; | ||
476 | + next; | ||
477 | +} | ||
478 | + | ||
479 | +{ | ||
480 | + ver[$1] = thislib; | ||
481 | + next; | ||
482 | +} | ||
483 | + | ||
484 | +END { | ||
485 | + if (!sawsymbol) | ||
486 | + { | ||
487 | + print "No symbols seen -- broken or mis-installed nm?" | "cat 1>&2"; | ||
488 | + exit 1; | ||
489 | + } | ||
490 | + for (l in libs) | ||
491 | + output(l); | ||
492 | +} | ||
493 | + | ||
494 | +function output(lib) { | ||
495 | + if (done[lib]) | ||
496 | + return; | ||
497 | + done[lib] = 1; | ||
498 | + if (inherit[lib]) | ||
499 | + output(inherit[lib]); | ||
500 | + | ||
501 | + empty=1 | ||
502 | + for (sym in ver) | ||
503 | + if ((ver[sym] == lib) && (sym in def)) | ||
504 | + { | ||
505 | + if (empty) | ||
506 | + { | ||
507 | + printf("%s {\n", lib); | ||
508 | + printf(" global:\n"); | ||
509 | + empty = 0; | ||
510 | + } | ||
511 | + symp = sym; | ||
512 | + sub(/@GCC_[0-9.]*$/,"",symp); | ||
513 | + printf("\t%s;\n", symp); | ||
514 | + if (dotsyms) | ||
515 | + printf("\t.%s;\n", symp); | ||
516 | + } | ||
517 | + | ||
518 | + if (empty) | ||
519 | + { | ||
520 | + for (l in libs) | ||
521 | + if (inherit[l] == lib) | ||
522 | + inherit[l] = inherit[lib]; | ||
523 | + } | ||
524 | + else if (inherit[lib]) | ||
525 | + printf("} %s;\n", inherit[lib]); | ||
526 | + else | ||
527 | + printf ("\n local:\n\t*;\n};\n"); | ||
528 | +} | ||
529 | Index: gcc/config/ia64/libgcc-ia64-no-libunwind.ver | ||
530 | =================================================================== | ||
531 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
532 | +++ gcc/config/ia64/libgcc-ia64-no-libunwind.ver 2010-06-25 10:14:32.525880902 -0700 | ||
533 | @@ -0,0 +1,17 @@ | ||
534 | +GCC_3.4.2 { | ||
535 | + _Unwind_GetGR | ||
536 | + _Unwind_RaiseException | ||
537 | + _Unwind_GetRegionStart | ||
538 | + _Unwind_SetIP | ||
539 | + _Unwind_GetIP | ||
540 | + _Unwind_GetLanguageSpecificData | ||
541 | + _Unwind_Resume | ||
542 | + _Unwind_DeleteException | ||
543 | + _Unwind_SetGR | ||
544 | + _Unwind_ForcedUnwind | ||
545 | + _Unwind_Backtrace | ||
546 | + _Unwind_FindEnclosingFunction | ||
547 | + _Unwind_GetCFA | ||
548 | + _Unwind_Resume_or_Rethrow | ||
549 | + _Unwind_GetBSP | ||
550 | +} | ||