tidy code
[tinycc.git] / tccelf.c
blob0a5ba71dc1cdd4ca02c0e2e544f813d7c1660c57
1 /*
2 * ELF file handling for TCC
4 * Copyright (c) 2001-2004 Fabrice Bellard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "tcc.h"
23 /* Define this to get some debug output during relocation processing. */
24 #undef DEBUG_RELOC
26 /********************************************************/
27 /* global variables */
29 ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */
30 ST_DATA Section *common_section;
31 ST_DATA Section *cur_text_section; /* current section where function code is generated */
32 #ifdef CONFIG_TCC_ASM
33 ST_DATA Section *last_text_section; /* to handle .previous asm directive */
34 #endif
35 #ifdef CONFIG_TCC_BCHECK
36 /* bound check related sections */
37 ST_DATA Section *bounds_section; /* contains global data bound description */
38 ST_DATA Section *lbounds_section; /* contains local data bound description */
39 #endif
40 /* symbol sections */
41 ST_DATA Section *symtab_section;
42 /* debug sections */
43 ST_DATA Section *stab_section, *stabstr_section;
45 /* XXX: avoid static variable */
46 static int new_undef_sym = 0; /* Is there a new undefined sym since last new_undef_sym() */
48 /* special flag to indicate that the section should not be linked to the other ones */
49 #define SHF_PRIVATE 0x80000000
50 /* section is dynsymtab_section */
51 #define SHF_DYNSYM 0x40000000
53 /* ------------------------------------------------------------------------- */
55 ST_FUNC void tccelf_new(TCCState *s)
57 /* no section zero */
58 dynarray_add(&s->sections, &s->nb_sections, NULL);
60 /* create standard sections */
61 text_section = new_section(s, ".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);
62 data_section = new_section(s, ".data", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);
63 bss_section = new_section(s, ".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
64 common_section = new_section(s, ".common", SHT_NOBITS, SHF_PRIVATE);
65 common_section->sh_num = SHN_COMMON;
67 /* symbols are always generated for linking stage */
68 symtab_section = new_symtab(s, ".symtab", SHT_SYMTAB, 0,
69 ".strtab",
70 ".hashtab", SHF_PRIVATE);
71 s->symtab = symtab_section;
73 /* private symbol table for dynamic symbols */
74 s->dynsymtab_section = new_symtab(s, ".dynsymtab", SHT_SYMTAB, SHF_PRIVATE|SHF_DYNSYM,
75 ".dynstrtab",
76 ".dynhashtab", SHF_PRIVATE);
77 get_sym_attr(s, 0, 1);
80 #ifdef CONFIG_TCC_BCHECK
81 ST_FUNC void tccelf_bounds_new(TCCState *s)
83 /* create bounds sections */
84 bounds_section = new_section(s, ".bounds",
85 SHT_PROGBITS, SHF_ALLOC);
86 lbounds_section = new_section(s, ".lbounds",
87 SHT_PROGBITS, SHF_ALLOC);
89 #endif
91 ST_FUNC void tccelf_stab_new(TCCState *s)
93 stab_section = new_section(s, ".stab", SHT_PROGBITS, 0);
94 stab_section->sh_entsize = sizeof(Stab_Sym);
95 stabstr_section = new_section(s, ".stabstr", SHT_STRTAB, 0);
96 put_elf_str(stabstr_section, "");
97 stab_section->link = stabstr_section;
98 /* put first entry */
99 put_stabs("", 0, 0, 0, 0);
102 static void free_section(Section *s)
104 tcc_free(s->data);
107 ST_FUNC void tccelf_delete(TCCState *s1)
109 int i;
111 /* free all sections */
112 for(i = 1; i < s1->nb_sections; i++)
113 free_section(s1->sections[i]);
114 dynarray_reset(&s1->sections, &s1->nb_sections);
116 for(i = 0; i < s1->nb_priv_sections; i++)
117 free_section(s1->priv_sections[i]);
118 dynarray_reset(&s1->priv_sections, &s1->nb_priv_sections);
120 /* free any loaded DLLs */
121 #ifdef TCC_IS_NATIVE
122 for ( i = 0; i < s1->nb_loaded_dlls; i++) {
123 DLLReference *ref = s1->loaded_dlls[i];
124 if ( ref->handle )
125 # ifdef _WIN32
126 FreeLibrary((HMODULE)ref->handle);
127 # else
128 dlclose(ref->handle);
129 # endif
131 #endif
132 /* free loaded dlls array */
133 dynarray_reset(&s1->loaded_dlls, &s1->nb_loaded_dlls);
134 tcc_free(s1->sym_attrs);
136 symtab_section = NULL; /* for tccrun.c:rt_printline() */
139 /* save section data state */
140 ST_FUNC void tccelf_begin_file(TCCState *s1)
142 Section *s; int i;
143 for (i = 1; i < s1->nb_sections; i++) {
144 s = s1->sections[i];
145 s->sh_offset = s->data_offset;
147 /* disable symbol hashing during compilation */
148 s = s1->symtab, s->reloc = s->hash, s->hash = NULL;
149 #if defined TCC_TARGET_X86_64 && defined TCC_TARGET_PE
150 s1->uw_sym = 0;
151 #endif
154 /* At the end of compilation, convert any UNDEF syms to global, and merge
155 with previously existing symbols */
156 ST_FUNC void tccelf_end_file(TCCState *s1)
158 Section *s = s1->symtab;
159 int first_sym, nb_syms, *tr, i;
161 first_sym = s->sh_offset / sizeof (ElfSym);
162 nb_syms = s->data_offset / sizeof (ElfSym) - first_sym;
163 s->data_offset = s->sh_offset;
164 s->link->data_offset = s->link->sh_offset;
165 s->hash = s->reloc, s->reloc = NULL;
166 tr = tcc_mallocz(nb_syms * sizeof *tr);
168 for (i = 0; i < nb_syms; ++i) {
169 ElfSym *sym = (ElfSym*)s->data + first_sym + i;
170 if (sym->st_shndx == SHN_UNDEF
171 && ELFW(ST_BIND)(sym->st_info) == STB_LOCAL)
172 sym->st_info = ELFW(ST_INFO)(STB_GLOBAL, ELFW(ST_TYPE)(sym->st_info));
173 tr[i] = set_elf_sym(s, sym->st_value, sym->st_size, sym->st_info,
174 sym->st_other, sym->st_shndx, s->link->data + sym->st_name);
176 /* now update relocations */
177 for (i = 1; i < s1->nb_sections; i++) {
178 Section *sr = s1->sections[i];
179 if (sr->sh_type == SHT_RELX && sr->link == s) {
180 ElfW_Rel *rel = (ElfW_Rel*)(sr->data + sr->sh_offset);
181 ElfW_Rel *rel_end = (ElfW_Rel*)(sr->data + sr->data_offset);
182 for (; rel < rel_end; ++rel) {
183 int n = ELFW(R_SYM)(rel->r_info) - first_sym;
184 //if (n < 0) tcc_error("internal: invalid symbol index in relocation");
185 rel->r_info = ELFW(R_INFO)(tr[n], ELFW(R_TYPE)(rel->r_info));
189 tcc_free(tr);
192 ST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags)
194 Section *sec;
196 sec = tcc_mallocz(sizeof(Section) + strlen(name));
197 strcpy(sec->name, name);
198 sec->sh_type = sh_type;
199 sec->sh_flags = sh_flags;
200 switch(sh_type) {
201 case SHT_HASH:
202 case SHT_REL:
203 case SHT_RELA:
204 case SHT_DYNSYM:
205 case SHT_SYMTAB:
206 case SHT_DYNAMIC:
207 sec->sh_addralign = 4;
208 break;
209 case SHT_STRTAB:
210 sec->sh_addralign = 1;
211 break;
212 default:
213 sec->sh_addralign = PTR_SIZE; /* gcc/pcc default alignment */
214 break;
217 if (sh_flags & SHF_PRIVATE) {
218 dynarray_add(&s1->priv_sections, &s1->nb_priv_sections, sec);
219 } else {
220 sec->sh_num = s1->nb_sections;
221 dynarray_add(&s1->sections, &s1->nb_sections, sec);
224 return sec;
227 ST_FUNC Section *new_symtab(TCCState *s1,
228 const char *symtab_name, int sh_type, int sh_flags,
229 const char *strtab_name,
230 const char *hash_name, int hash_sh_flags)
232 Section *symtab, *strtab, *hash;
233 int *ptr, nb_buckets;
235 symtab = new_section(s1, symtab_name, sh_type, sh_flags);
236 symtab->sh_entsize = sizeof(ElfW(Sym));
237 strtab = new_section(s1, strtab_name, SHT_STRTAB, sh_flags);
238 put_elf_str(strtab, "");
239 symtab->link = strtab;
240 put_elf_sym(symtab, 0, 0, 0, 0, 0, NULL);
242 nb_buckets = 1;
244 hash = new_section(s1, hash_name, SHT_HASH, hash_sh_flags);
245 hash->sh_entsize = sizeof(int);
246 symtab->hash = hash;
247 hash->link = symtab;
249 ptr = section_ptr_add(hash, (2 + nb_buckets + 1) * sizeof(int));
250 ptr[0] = nb_buckets;
251 ptr[1] = 1;
252 memset(ptr + 2, 0, (nb_buckets + 1) * sizeof(int));
253 return symtab;
256 /* realloc section and set its content to zero */
257 ST_FUNC void section_realloc(Section *sec, unsigned long new_size)
259 unsigned long size;
260 unsigned char *data;
262 size = sec->data_allocated;
263 if (size == 0)
264 size = 1;
265 while (size < new_size)
266 size = size * 2;
267 data = tcc_realloc(sec->data, size);
268 memset(data + sec->data_allocated, 0, size - sec->data_allocated);
269 sec->data = data;
270 sec->data_allocated = size;
273 /* reserve at least 'size' bytes aligned per 'align' in section
274 'sec' from current offset, and return the aligned offset */
275 ST_FUNC size_t section_add(Section *sec, addr_t size, int align)
277 size_t offset, offset1;
279 offset = (sec->data_offset + align - 1) & -align;
280 offset1 = offset + size;
281 if (sec->sh_type != SHT_NOBITS && offset1 > sec->data_allocated)
282 section_realloc(sec, offset1);
283 sec->data_offset = offset1;
284 if (align > sec->sh_addralign)
285 sec->sh_addralign = align;
286 return offset;
289 /* reserve at least 'size' bytes in section 'sec' from
290 sec->data_offset. */
291 ST_FUNC void *section_ptr_add(Section *sec, addr_t size)
293 size_t offset = section_add(sec, size, 1);
294 return sec->data + offset;
297 /* reserve at least 'size' bytes from section start */
298 ST_FUNC void section_reserve(Section *sec, unsigned long size)
300 if (size > sec->data_allocated)
301 section_realloc(sec, size);
302 if (size > sec->data_offset)
303 sec->data_offset = size;
306 /* return a reference to a section, and create it if it does not
307 exists */
308 ST_FUNC Section *find_section(TCCState *s1, const char *name)
310 Section *sec;
311 int i;
312 for(i = 1; i < s1->nb_sections; i++) {
313 sec = s1->sections[i];
314 if (!strcmp(name, sec->name))
315 return sec;
317 /* sections are created as PROGBITS */
318 return new_section(s1, name, SHT_PROGBITS, SHF_ALLOC);
321 /* ------------------------------------------------------------------------- */
323 ST_FUNC int put_elf_str(Section *s, const char *sym)
325 int offset, len;
326 char *ptr;
328 len = strlen(sym) + 1;
329 offset = s->data_offset;
330 ptr = section_ptr_add(s, len);
331 memmove(ptr, sym, len);
332 return offset;
335 /* elf symbol hashing function */
336 static unsigned long elf_hash(const unsigned char *name)
338 unsigned long h = 0, g;
340 while (*name) {
341 h = (h << 4) + *name++;
342 g = h & 0xf0000000;
343 if (g)
344 h ^= g >> 24;
345 h &= ~g;
347 return h;
350 /* rebuild hash table of section s */
351 /* NOTE: we do factorize the hash table code to go faster */
352 static void rebuild_hash(Section *s, unsigned int nb_buckets)
354 ElfW(Sym) *sym;
355 int *ptr, *hash, nb_syms, sym_index, h;
356 unsigned char *strtab;
358 strtab = s->link->data;
359 nb_syms = s->data_offset / sizeof(ElfW(Sym));
361 if (!nb_buckets)
362 nb_buckets = ((int*)s->hash->data)[0];
364 s->hash->data_offset = 0;
365 ptr = section_ptr_add(s->hash, (2 + nb_buckets + nb_syms) * sizeof(int));
366 ptr[0] = nb_buckets;
367 ptr[1] = nb_syms;
368 ptr += 2;
369 hash = ptr;
370 memset(hash, 0, (nb_buckets + 1) * sizeof(int));
371 ptr += nb_buckets + 1;
373 sym = (ElfW(Sym) *)s->data + 1;
374 for(sym_index = 1; sym_index < nb_syms; sym_index++) {
375 if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
376 h = elf_hash(strtab + sym->st_name) % nb_buckets;
377 *ptr = hash[h];
378 hash[h] = sym_index;
379 } else {
380 *ptr = 0;
382 ptr++;
383 sym++;
387 /* return the symbol number */
388 ST_FUNC int put_elf_sym(Section *s, addr_t value, unsigned long size,
389 int info, int other, int shndx, const char *name)
391 int name_offset, sym_index;
392 int nbuckets, h;
393 ElfW(Sym) *sym;
394 Section *hs;
396 sym = section_ptr_add(s, sizeof(ElfW(Sym)));
397 if (name && name[0])
398 name_offset = put_elf_str(s->link, name);
399 else
400 name_offset = 0;
401 /* XXX: endianness */
402 sym->st_name = name_offset;
403 sym->st_value = value;
404 sym->st_size = size;
405 sym->st_info = info;
406 sym->st_other = other;
407 sym->st_shndx = shndx;
408 sym_index = sym - (ElfW(Sym) *)s->data;
409 hs = s->hash;
410 if (hs) {
411 int *ptr, *base;
412 ptr = section_ptr_add(hs, sizeof(int));
413 base = (int *)hs->data;
414 /* only add global or weak symbols. */
415 if (ELFW(ST_BIND)(info) != STB_LOCAL) {
416 /* add another hashing entry */
417 nbuckets = base[0];
418 h = elf_hash((unsigned char *)s->link->data + name_offset) % nbuckets;
419 *ptr = base[2 + h];
420 base[2 + h] = sym_index;
421 base[1]++;
422 /* we resize the hash table */
423 hs->nb_hashed_syms++;
424 if (hs->nb_hashed_syms > 2 * nbuckets) {
425 rebuild_hash(s, 2 * nbuckets);
427 } else {
428 *ptr = 0;
429 base[1]++;
432 return sym_index;
435 ST_FUNC int find_elf_sym(Section *s, const char *name)
437 ElfW(Sym) *sym;
438 Section *hs;
439 int nbuckets, sym_index, h;
440 const char *name1;
442 hs = s->hash;
443 if (!hs)
444 return 0;
445 nbuckets = ((int *)hs->data)[0];
446 h = elf_hash((unsigned char *) name) % nbuckets;
447 sym_index = ((int *)hs->data)[2 + h];
448 while (sym_index != 0) {
449 sym = &((ElfW(Sym) *)s->data)[sym_index];
450 name1 = (char *) s->link->data + sym->st_name;
451 if (!strcmp(name, name1))
452 return sym_index;
453 sym_index = ((int *)hs->data)[2 + nbuckets + sym_index];
455 return 0;
458 /* return elf symbol value, signal error if 'err' is nonzero */
459 ST_FUNC addr_t get_elf_sym_addr(TCCState *s, const char *name, int err)
461 int sym_index;
462 ElfW(Sym) *sym;
464 sym_index = find_elf_sym(s->symtab, name);
465 sym = &((ElfW(Sym) *)s->symtab->data)[sym_index];
466 if (!sym_index || sym->st_shndx == SHN_UNDEF) {
467 if (err)
468 tcc_error("%s not defined", name);
469 return 0;
471 return sym->st_value;
474 /* return elf symbol value */
475 LIBTCCAPI void *tcc_get_symbol(TCCState *s, const char *name)
477 return (void*)(uintptr_t)get_elf_sym_addr(s, name, 0);
480 #if defined TCC_IS_NATIVE || defined TCC_TARGET_PE
481 /* return elf symbol value or error */
482 ST_FUNC void* tcc_get_symbol_err(TCCState *s, const char *name)
484 return (void*)(uintptr_t)get_elf_sym_addr(s, name, 1);
486 #endif
488 /* add an elf symbol : check if it is already defined and patch
489 it. Return symbol index. NOTE that sh_num can be SHN_UNDEF. */
490 ST_FUNC int set_elf_sym(Section *s, addr_t value, unsigned long size,
491 int info, int other, int shndx, const char *name)
493 ElfW(Sym) *esym;
494 int sym_bind, sym_index, sym_type, esym_bind;
495 unsigned char sym_vis, esym_vis, new_vis;
497 sym_bind = ELFW(ST_BIND)(info);
498 sym_type = ELFW(ST_TYPE)(info);
499 sym_vis = ELFW(ST_VISIBILITY)(other);
501 if (sym_bind != STB_LOCAL) {
502 /* we search global or weak symbols */
503 sym_index = find_elf_sym(s, name);
504 if (!sym_index)
505 goto do_def;
506 esym = &((ElfW(Sym) *)s->data)[sym_index];
507 if (esym->st_value == value && esym->st_size == size && esym->st_info == info
508 && esym->st_other == other && esym->st_shndx == shndx)
509 return sym_index;
510 if (esym->st_shndx != SHN_UNDEF) {
511 esym_bind = ELFW(ST_BIND)(esym->st_info);
512 /* propagate the most constraining visibility */
513 /* STV_DEFAULT(0)<STV_PROTECTED(3)<STV_HIDDEN(2)<STV_INTERNAL(1) */
514 esym_vis = ELFW(ST_VISIBILITY)(esym->st_other);
515 if (esym_vis == STV_DEFAULT) {
516 new_vis = sym_vis;
517 } else if (sym_vis == STV_DEFAULT) {
518 new_vis = esym_vis;
519 } else {
520 new_vis = (esym_vis < sym_vis) ? esym_vis : sym_vis;
522 esym->st_other = (esym->st_other & ~ELFW(ST_VISIBILITY)(-1))
523 | new_vis;
524 other = esym->st_other; /* in case we have to patch esym */
525 if (shndx == SHN_UNDEF) {
526 /* ignore adding of undefined symbol if the
527 corresponding symbol is already defined */
528 } else if (sym_bind == STB_GLOBAL && esym_bind == STB_WEAK) {
529 /* global overrides weak, so patch */
530 goto do_patch;
531 } else if (sym_bind == STB_WEAK && esym_bind == STB_GLOBAL) {
532 /* weak is ignored if already global */
533 } else if (sym_bind == STB_WEAK && esym_bind == STB_WEAK) {
534 /* keep first-found weak definition, ignore subsequents */
535 } else if (sym_vis == STV_HIDDEN || sym_vis == STV_INTERNAL) {
536 /* ignore hidden symbols after */
537 } else if ((esym->st_shndx == SHN_COMMON
538 || esym->st_shndx == bss_section->sh_num)
539 && (shndx < SHN_LORESERVE
540 && shndx != bss_section->sh_num)) {
541 /* data symbol gets precedence over common/bss */
542 goto do_patch;
543 } else if (shndx == SHN_COMMON || shndx == bss_section->sh_num) {
544 /* data symbol keeps precedence over common/bss */
545 } else if (s->sh_flags & SHF_DYNSYM) {
546 /* we accept that two DLL define the same symbol */
547 } else if (esym->st_other & ST_ASM_SET) {
548 /* If the existing symbol came from an asm .set
549 we can override. */
550 goto do_patch;
551 } else {
552 #if 0
553 printf("new_bind=%x new_shndx=%x new_vis=%x old_bind=%x old_shndx=%x old_vis=%x\n",
554 sym_bind, shndx, new_vis, esym_bind, esym->st_shndx, esym_vis);
555 #endif
556 tcc_error_noabort("'%s' defined twice", name);
558 } else {
559 do_patch:
560 esym->st_info = ELFW(ST_INFO)(sym_bind, sym_type);
561 esym->st_shndx = shndx;
562 new_undef_sym = 1;
563 esym->st_value = value;
564 esym->st_size = size;
565 esym->st_other = other;
567 } else {
568 do_def:
569 sym_index = put_elf_sym(s, value, size,
570 ELFW(ST_INFO)(sym_bind, sym_type), other,
571 shndx, name);
573 return sym_index;
576 /* put relocation */
577 ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset,
578 int type, int symbol, addr_t addend)
580 char buf[256];
581 Section *sr;
582 ElfW_Rel *rel;
584 sr = s->reloc;
585 if (!sr) {
586 /* if no relocation section, create it */
587 snprintf(buf, sizeof(buf), REL_SECTION_FMT, s->name);
588 /* if the symtab is allocated, then we consider the relocation
589 are also */
590 sr = new_section(tcc_state, buf, SHT_RELX, symtab->sh_flags);
591 sr->sh_entsize = sizeof(ElfW_Rel);
592 sr->link = symtab;
593 sr->sh_info = s->sh_num;
594 s->reloc = sr;
596 rel = section_ptr_add(sr, sizeof(ElfW_Rel));
597 rel->r_offset = offset;
598 rel->r_info = ELFW(R_INFO)(symbol, type);
599 #if SHT_RELX == SHT_RELA
600 rel->r_addend = addend;
601 #else
602 if (addend)
603 tcc_error("non-zero addend on REL architecture");
604 #endif
607 ST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset,
608 int type, int symbol)
610 put_elf_reloca(symtab, s, offset, type, symbol, 0);
613 /* Remove relocations for section S->reloc starting at oldrelocoffset
614 that are to the same place, retaining the last of them. As side effect
615 the relocations are sorted. Possibly reduces the number of relocs. */
616 ST_FUNC void squeeze_multi_relocs(Section *s, size_t oldrelocoffset)
618 Section *sr = s->reloc;
619 ElfW_Rel *r, *dest;
620 ssize_t a;
621 ElfW(Addr) addr;
623 if (oldrelocoffset + sizeof(*r) >= sr->data_offset)
624 return;
625 /* The relocs we're dealing with are the result of initializer parsing.
626 So they will be mostly in order and there aren't many of them.
627 Secondly we need a stable sort (which qsort isn't). We use
628 a simple insertion sort. */
629 for (a = oldrelocoffset + sizeof(*r); a < sr->data_offset; a += sizeof(*r)) {
630 ssize_t i = a - sizeof(*r);
631 addr = ((ElfW_Rel*)(sr->data + a))->r_offset;
632 for (; i >= (ssize_t)oldrelocoffset &&
633 ((ElfW_Rel*)(sr->data + i))->r_offset > addr; i -= sizeof(*r)) {
634 ElfW_Rel tmp = *(ElfW_Rel*)(sr->data + a);
635 *(ElfW_Rel*)(sr->data + a) = *(ElfW_Rel*)(sr->data + i);
636 *(ElfW_Rel*)(sr->data + i) = tmp;
640 r = (ElfW_Rel*)(sr->data + oldrelocoffset);
641 dest = r;
642 for (; r < (ElfW_Rel*)(sr->data + sr->data_offset); r++) {
643 if (dest->r_offset != r->r_offset)
644 dest++;
645 *dest = *r;
647 sr->data_offset = (unsigned char*)dest - sr->data + sizeof(*r);
650 /* put stab debug information */
652 ST_FUNC void put_stabs(const char *str, int type, int other, int desc,
653 unsigned long value)
655 Stab_Sym *sym;
657 sym = section_ptr_add(stab_section, sizeof(Stab_Sym));
658 if (str) {
659 sym->n_strx = put_elf_str(stabstr_section, str);
660 } else {
661 sym->n_strx = 0;
663 sym->n_type = type;
664 sym->n_other = other;
665 sym->n_desc = desc;
666 sym->n_value = value;
669 ST_FUNC void put_stabs_r(const char *str, int type, int other, int desc,
670 unsigned long value, Section *sec, int sym_index)
672 put_stabs(str, type, other, desc, value);
673 put_elf_reloc(symtab_section, stab_section,
674 stab_section->data_offset - sizeof(unsigned int),
675 R_DATA_32, sym_index);
678 ST_FUNC void put_stabn(int type, int other, int desc, int value)
680 put_stabs(NULL, type, other, desc, value);
683 ST_FUNC void put_stabd(int type, int other, int desc)
685 put_stabs(NULL, type, other, desc, 0);
688 ST_FUNC struct sym_attr *get_sym_attr(TCCState *s1, int index, int alloc)
690 int n;
691 struct sym_attr *tab;
693 if (index >= s1->nb_sym_attrs) {
694 if (!alloc)
695 return s1->sym_attrs;
696 /* find immediately bigger power of 2 and reallocate array */
697 n = 1;
698 while (index >= n)
699 n *= 2;
700 tab = tcc_realloc(s1->sym_attrs, n * sizeof(*s1->sym_attrs));
701 s1->sym_attrs = tab;
702 memset(s1->sym_attrs + s1->nb_sym_attrs, 0,
703 (n - s1->nb_sym_attrs) * sizeof(*s1->sym_attrs));
704 s1->nb_sym_attrs = n;
706 return &s1->sym_attrs[index];
709 /* Browse each elem of type <type> in section <sec> starting at elem <startoff>
710 using variable <elem> */
711 #define for_each_elem(sec, startoff, elem, type) \
712 for (elem = (type *) sec->data + startoff; \
713 elem < (type *) (sec->data + sec->data_offset); elem++)
715 /* In an ELF file symbol table, the local symbols must appear below
716 the global and weak ones. Since TCC cannot sort it while generating
717 the code, we must do it after. All the relocation tables are also
718 modified to take into account the symbol table sorting */
719 static void sort_syms(TCCState *s1, Section *s)
721 int *old_to_new_syms;
722 ElfW(Sym) *new_syms;
723 int nb_syms, i;
724 ElfW(Sym) *p, *q;
725 ElfW_Rel *rel;
726 Section *sr;
727 int type, sym_index;
729 nb_syms = s->data_offset / sizeof(ElfW(Sym));
730 new_syms = tcc_malloc(nb_syms * sizeof(ElfW(Sym)));
731 old_to_new_syms = tcc_malloc(nb_syms * sizeof(int));
733 /* first pass for local symbols */
734 p = (ElfW(Sym) *)s->data;
735 q = new_syms;
736 for(i = 0; i < nb_syms; i++) {
737 if (ELFW(ST_BIND)(p->st_info) == STB_LOCAL) {
738 old_to_new_syms[i] = q - new_syms;
739 *q++ = *p;
741 p++;
743 /* save the number of local symbols in section header */
744 if( s->sh_size ) /* this 'if' makes IDA happy */
745 s->sh_info = q - new_syms;
747 /* then second pass for non local symbols */
748 p = (ElfW(Sym) *)s->data;
749 for(i = 0; i < nb_syms; i++) {
750 if (ELFW(ST_BIND)(p->st_info) != STB_LOCAL) {
751 old_to_new_syms[i] = q - new_syms;
752 *q++ = *p;
754 p++;
757 /* we copy the new symbols to the old */
758 memcpy(s->data, new_syms, nb_syms * sizeof(ElfW(Sym)));
759 tcc_free(new_syms);
761 /* now we modify all the relocations */
762 for(i = 1; i < s1->nb_sections; i++) {
763 sr = s1->sections[i];
764 if (sr->sh_type == SHT_RELX && sr->link == s) {
765 for_each_elem(sr, 0, rel, ElfW_Rel) {
766 sym_index = ELFW(R_SYM)(rel->r_info);
767 type = ELFW(R_TYPE)(rel->r_info);
768 sym_index = old_to_new_syms[sym_index];
769 rel->r_info = ELFW(R_INFO)(sym_index, type);
774 tcc_free(old_to_new_syms);
777 /* relocate symbol table, resolve undefined symbols if do_resolve is
778 true and output error if undefined symbol. */
779 ST_FUNC void relocate_syms(TCCState *s1, Section *symtab, int do_resolve)
781 ElfW(Sym) *sym;
782 int sym_bind, sh_num;
783 const char *name;
785 for_each_elem(symtab, 1, sym, ElfW(Sym)) {
786 sh_num = sym->st_shndx;
787 if (sh_num == SHN_UNDEF) {
788 name = (char *) s1->symtab->link->data + sym->st_name;
789 /* Use ld.so to resolve symbol for us (for tcc -run) */
790 if (do_resolve) {
791 #if defined TCC_IS_NATIVE && !defined TCC_TARGET_PE
792 void *addr = dlsym(RTLD_DEFAULT, name);
793 if (addr) {
794 sym->st_value = (addr_t) addr;
795 #ifdef DEBUG_RELOC
796 printf ("relocate_sym: %s -> 0x%lx\n", name, sym->st_value);
797 #endif
798 goto found;
800 #endif
801 /* if dynamic symbol exist, it will be used in relocate_section */
802 } else if (s1->dynsym && find_elf_sym(s1->dynsym, name))
803 goto found;
804 /* XXX: _fp_hw seems to be part of the ABI, so we ignore
805 it */
806 if (!strcmp(name, "_fp_hw"))
807 goto found;
808 /* only weak symbols are accepted to be undefined. Their
809 value is zero */
810 sym_bind = ELFW(ST_BIND)(sym->st_info);
811 if (sym_bind == STB_WEAK)
812 sym->st_value = 0;
813 else
814 tcc_error_noabort("undefined symbol '%s'", name);
815 } else if (sh_num < SHN_LORESERVE) {
816 /* add section base */
817 sym->st_value += s1->sections[sym->st_shndx]->sh_addr;
819 found: ;
823 /* relocate a given section (CPU dependent) by applying the relocations
824 in the associated relocation section */
825 ST_FUNC void relocate_section(TCCState *s1, Section *s)
827 Section *sr = s->reloc;
828 ElfW_Rel *rel;
829 ElfW(Sym) *sym;
830 int type, sym_index;
831 unsigned char *ptr;
832 addr_t tgt, addr;
834 relocate_init(sr);
836 for_each_elem(sr, 0, rel, ElfW_Rel) {
837 ptr = s->data + rel->r_offset;
838 sym_index = ELFW(R_SYM)(rel->r_info);
839 sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
840 type = ELFW(R_TYPE)(rel->r_info);
841 tgt = sym->st_value;
842 #if SHT_RELX == SHT_RELA
843 tgt += rel->r_addend;
844 #endif
845 addr = s->sh_addr + rel->r_offset;
846 relocate(s1, rel, type, ptr, addr, tgt);
848 /* if the relocation is allocated, we change its symbol table */
849 if (sr->sh_flags & SHF_ALLOC)
850 sr->link = s1->dynsym;
853 /* relocate relocation table in 'sr' */
854 static void relocate_rel(TCCState *s1, Section *sr)
856 Section *s;
857 ElfW_Rel *rel;
859 s = s1->sections[sr->sh_info];
860 for_each_elem(sr, 0, rel, ElfW_Rel)
861 rel->r_offset += s->sh_addr;
864 /* count the number of dynamic relocations so that we can reserve
865 their space */
866 static int prepare_dynamic_rel(TCCState *s1, Section *sr)
868 ElfW_Rel *rel;
869 int type, count;
871 count = 0;
872 for_each_elem(sr, 0, rel, ElfW_Rel) {
873 #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)
874 int sym_index = ELFW(R_SYM)(rel->r_info);
875 #endif
876 type = ELFW(R_TYPE)(rel->r_info);
877 switch(type) {
878 #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)
879 #if defined(TCC_TARGET_I386)
880 case R_386_32:
881 if (!get_sym_attr(s1, sym_index, 0)->dyn_index
882 && ((ElfW(Sym)*)symtab_section->data + sym_index)->st_shndx == SHN_UNDEF) {
883 /* don't fixup unresolved (weak) symbols */
884 rel->r_info = ELFW(R_INFO)(sym_index, R_386_RELATIVE);
885 break;
887 #elif defined(TCC_TARGET_X86_64)
888 case R_X86_64_32:
889 case R_X86_64_32S:
890 case R_X86_64_64:
891 #endif
892 count++;
893 break;
894 #if defined(TCC_TARGET_I386)
895 case R_386_PC32:
896 #elif defined(TCC_TARGET_X86_64)
897 case R_X86_64_PC32:
898 #endif
899 if (get_sym_attr(s1, sym_index, 0)->dyn_index)
900 count++;
901 break;
902 #endif
903 default:
904 break;
907 if (count) {
908 /* allocate the section */
909 sr->sh_flags |= SHF_ALLOC;
910 sr->sh_size = count * sizeof(ElfW_Rel);
912 return count;
915 static void build_got(TCCState *s1)
917 /* if no got, then create it */
918 s1->got = new_section(s1, ".got", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);
919 s1->got->sh_entsize = 4;
920 set_elf_sym(symtab_section, 0, 4, ELFW(ST_INFO)(STB_GLOBAL, STT_OBJECT),
921 0, s1->got->sh_num, "_GLOBAL_OFFSET_TABLE_");
922 /* keep space for _DYNAMIC pointer and two dummy got entries */
923 section_ptr_add(s1->got, 3 * PTR_SIZE);
926 /* Create a GOT and (for function call) a PLT entry corresponding to a symbol
927 in s1->symtab. When creating the dynamic symbol table entry for the GOT
928 relocation, use 'size' and 'info' for the corresponding symbol metadata.
929 Returns the offset of the GOT or (if any) PLT entry. */
930 static struct sym_attr * put_got_entry(TCCState *s1, int dyn_reloc_type,
931 unsigned long size,
932 int info, int sym_index)
934 int need_plt_entry;
935 const char *name;
936 ElfW(Sym) *sym;
937 struct sym_attr *attr;
938 unsigned got_offset;
939 char plt_name[100];
940 int len;
942 need_plt_entry = (dyn_reloc_type == R_JMP_SLOT);
943 attr = get_sym_attr(s1, sym_index, 1);
945 /* In case a function is both called and its address taken 2 GOT entries
946 are created, one for taking the address (GOT) and the other for the PLT
947 entry (PLTGOT). */
948 if (need_plt_entry ? attr->plt_offset : attr->got_offset)
949 return attr;
951 /* create the GOT entry */
952 got_offset = s1->got->data_offset;
953 section_ptr_add(s1->got, PTR_SIZE);
955 /* Create the GOT relocation that will insert the address of the object or
956 function of interest in the GOT entry. This is a static relocation for
957 memory output (dlsym will give us the address of symbols) and dynamic
958 relocation otherwise (executable and DLLs). The relocation should be
959 done lazily for GOT entry with *_JUMP_SLOT relocation type (the one
960 associated to a PLT entry) but is currently done at load time for an
961 unknown reason. */
963 sym = &((ElfW(Sym) *) symtab_section->data)[sym_index];
964 name = (char *) symtab_section->link->data + sym->st_name;
966 if (s1->dynsym) {
967 if (ELFW(ST_BIND)(sym->st_info) == STB_LOCAL) {
968 /* Hack alarm. We don't want to emit dynamic symbols
969 and symbol based relocs for STB_LOCAL symbols, but rather
970 want to resolve them directly. At this point the symbol
971 values aren't final yet, so we must defer this. We will later
972 have to create a RELATIVE reloc anyway, so we misuse the
973 relocation slot to smuggle the symbol reference until
974 fill_local_got_entries. Not that the sym_index is
975 relative to symtab_section, not s1->dynsym! Nevertheless
976 we use s1->dyn_sym so that if this is the first call
977 that got->reloc is correctly created. Also note that
978 RELATIVE relocs are not normally created for the .got,
979 so the types serves as a marker for later (and is retained
980 also for the final output, which is okay because then the
981 got is just normal data). */
982 put_elf_reloc(s1->dynsym, s1->got, got_offset, R_RELATIVE,
983 sym_index);
984 } else {
985 if (0 == attr->dyn_index)
986 attr->dyn_index = set_elf_sym(s1->dynsym, sym->st_value, size,
987 info, 0, sym->st_shndx, name);
988 put_elf_reloc(s1->dynsym, s1->got, got_offset, dyn_reloc_type,
989 attr->dyn_index);
991 } else {
992 put_elf_reloc(symtab_section, s1->got, got_offset, dyn_reloc_type,
993 sym_index);
996 if (need_plt_entry) {
997 if (!s1->plt) {
998 s1->plt = new_section(s1, ".plt", SHT_PROGBITS,
999 SHF_ALLOC | SHF_EXECINSTR);
1000 s1->plt->sh_entsize = 4;
1003 attr->plt_offset = create_plt_entry(s1, got_offset, attr);
1005 /* create a symbol 'sym@plt' for the PLT jump vector */
1006 len = strlen(name);
1007 if (len > sizeof plt_name - 5)
1008 len = sizeof plt_name - 5;
1009 memcpy(plt_name, name, len);
1010 strcpy(plt_name + len, "@plt");
1011 attr->plt_sym = put_elf_sym(s1->symtab, attr->plt_offset, sym->st_size,
1012 ELFW(ST_INFO)(STB_GLOBAL, STT_FUNC), 0, s1->plt->sh_num, plt_name);
1014 } else {
1015 attr->got_offset = got_offset;
1018 return attr;
1021 /* build GOT and PLT entries */
1022 ST_FUNC void build_got_entries(TCCState *s1)
1024 Section *s;
1025 ElfW_Rel *rel;
1026 ElfW(Sym) *sym;
1027 int i, type, gotplt_entry, reloc_type, sym_index;
1028 struct sym_attr *attr;
1030 for(i = 1; i < s1->nb_sections; i++) {
1031 s = s1->sections[i];
1032 if (s->sh_type != SHT_RELX)
1033 continue;
1034 /* no need to handle got relocations */
1035 if (s->link != symtab_section)
1036 continue;
1037 for_each_elem(s, 0, rel, ElfW_Rel) {
1038 type = ELFW(R_TYPE)(rel->r_info);
1039 gotplt_entry = gotplt_entry_type(type);
1040 sym_index = ELFW(R_SYM)(rel->r_info);
1041 sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
1043 if (gotplt_entry == NO_GOTPLT_ENTRY) {
1044 continue;
1047 /* Automatically create PLT/GOT [entry] if it is an undefined
1048 reference (resolved at runtime), or the symbol is absolute,
1049 probably created by tcc_add_symbol, and thus on 64-bit
1050 targets might be too far from application code. */
1051 if (gotplt_entry == AUTO_GOTPLT_ENTRY) {
1052 if (sym->st_shndx == SHN_UNDEF) {
1053 ElfW(Sym) *esym;
1054 int dynindex;
1055 if (s1->output_type == TCC_OUTPUT_DLL && ! PCRELATIVE_DLLPLT)
1056 continue;
1057 /* Relocations for UNDEF symbols would normally need
1058 to be transferred into the executable or shared object.
1059 If that were done AUTO_GOTPLT_ENTRY wouldn't exist.
1060 But TCC doesn't do that (at least for exes), so we
1061 need to resolve all such relocs locally. And that
1062 means PLT slots for functions in DLLs and COPY relocs for
1063 data symbols. COPY relocs were generated in
1064 bind_exe_dynsyms (and the symbol adjusted to be defined),
1065 and for functions we were generated a dynamic symbol
1066 of function type. */
1067 if (s1->dynsym) {
1068 /* dynsym isn't set for -run :-/ */
1069 dynindex = get_sym_attr(s1, sym_index, 0)->dyn_index;
1070 esym = (ElfW(Sym) *)s1->dynsym->data + dynindex;
1071 if (dynindex
1072 && (ELFW(ST_TYPE)(esym->st_info) == STT_FUNC
1073 || (ELFW(ST_TYPE)(esym->st_info) == STT_NOTYPE
1074 && ELFW(ST_TYPE)(sym->st_info) == STT_FUNC)))
1075 goto jmp_slot;
1077 } else if (!(sym->st_shndx == SHN_ABS
1078 #ifndef TCC_TARGET_ARM
1079 && PTR_SIZE == 8
1080 #endif
1082 continue;
1085 #ifdef TCC_TARGET_X86_64
1086 if ((type == R_X86_64_PLT32 || type == R_X86_64_PC32) &&
1087 sym->st_shndx != SHN_UNDEF &&
1088 (ELFW(ST_VISIBILITY)(sym->st_other) != STV_DEFAULT ||
1089 ELFW(ST_BIND)(sym->st_info) == STB_LOCAL ||
1090 s1->output_type == TCC_OUTPUT_EXE)) {
1091 rel->r_info = ELFW(R_INFO)(sym_index, R_X86_64_PC32);
1092 continue;
1094 #endif
1095 if (code_reloc(type)) {
1096 jmp_slot:
1097 reloc_type = R_JMP_SLOT;
1098 } else
1099 reloc_type = R_GLOB_DAT;
1101 if (!s1->got)
1102 build_got(s1);
1104 if (gotplt_entry == BUILD_GOT_ONLY)
1105 continue;
1107 attr = put_got_entry(s1, reloc_type, sym->st_size, sym->st_info,
1108 sym_index);
1110 if (reloc_type == R_JMP_SLOT)
1111 rel->r_info = ELFW(R_INFO)(attr->plt_sym, type);
1116 /* put dynamic tag */
1117 static void put_dt(Section *dynamic, int dt, addr_t val)
1119 ElfW(Dyn) *dyn;
1120 dyn = section_ptr_add(dynamic, sizeof(ElfW(Dyn)));
1121 dyn->d_tag = dt;
1122 dyn->d_un.d_val = val;
1125 #ifndef TCC_TARGET_PE
1126 static void add_init_array_defines(TCCState *s1, const char *section_name)
1128 Section *s;
1129 long end_offset;
1130 char sym_start[1024];
1131 char sym_end[1024];
1133 snprintf(sym_start, sizeof(sym_start), "__%s_start", section_name + 1);
1134 snprintf(sym_end, sizeof(sym_end), "__%s_end", section_name + 1);
1136 s = find_section(s1, section_name);
1137 if (!s) {
1138 end_offset = 0;
1139 s = data_section;
1140 } else {
1141 end_offset = s->data_offset;
1144 set_elf_sym(symtab_section,
1145 0, 0,
1146 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1147 s->sh_num, sym_start);
1148 set_elf_sym(symtab_section,
1149 end_offset, 0,
1150 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1151 s->sh_num, sym_end);
1154 static int tcc_add_support(TCCState *s1, const char *filename)
1156 char buf[1024];
1157 snprintf(buf, sizeof(buf), "%s/%s", s1->tcc_lib_path, filename);
1158 return tcc_add_file(s1, buf);
1160 #endif
1162 ST_FUNC void tcc_add_bcheck(TCCState *s1)
1164 #ifdef CONFIG_TCC_BCHECK
1165 addr_t *ptr;
1166 int sym_index;
1168 if (0 == s1->do_bounds_check)
1169 return;
1170 /* XXX: add an object file to do that */
1171 ptr = section_ptr_add(bounds_section, sizeof(*ptr));
1172 *ptr = 0;
1173 set_elf_sym(symtab_section, 0, 0,
1174 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1175 bounds_section->sh_num, "__bounds_start");
1176 /* pull bcheck.o from libtcc1.a */
1177 sym_index = set_elf_sym(symtab_section, 0, 0,
1178 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1179 SHN_UNDEF, "__bound_init");
1180 if (s1->output_type != TCC_OUTPUT_MEMORY) {
1181 /* add 'call __bound_init()' in .init section */
1182 Section *init_section = find_section(s1, ".init");
1183 unsigned char *pinit = section_ptr_add(init_section, 5);
1184 pinit[0] = 0xe8;
1185 write32le(pinit + 1, -4);
1186 put_elf_reloc(symtab_section, init_section,
1187 init_section->data_offset - 4, R_386_PC32, sym_index);
1188 /* R_386_PC32 = R_X86_64_PC32 = 2 */
1190 #endif
1193 /* add tcc runtime libraries */
1194 ST_FUNC void tcc_add_runtime(TCCState *s1)
1196 s1->filetype = 0;
1197 tcc_add_bcheck(s1);
1198 tcc_add_pragma_libs(s1);
1199 #ifndef TCC_TARGET_PE
1200 /* add libc */
1201 if (!s1->nostdlib) {
1202 tcc_add_library_err(s1, "c");
1203 #ifdef TCC_LIBGCC
1204 if (!s1->static_link) {
1205 if (TCC_LIBGCC[0] == '/')
1206 tcc_add_file(s1, TCC_LIBGCC);
1207 else
1208 tcc_add_dll(s1, TCC_LIBGCC, 0);
1210 #endif
1211 tcc_add_support(s1, TCC_LIBTCC1);
1212 /* add crt end if not memory output */
1213 if (s1->output_type != TCC_OUTPUT_MEMORY)
1214 tcc_add_crt(s1, "crtn.o");
1216 #endif
1219 /* add various standard linker symbols (must be done after the
1220 sections are filled (for example after allocating common
1221 symbols)) */
1222 static void tcc_add_linker_symbols(TCCState *s1)
1224 char buf[1024];
1225 int i;
1226 Section *s;
1228 set_elf_sym(symtab_section,
1229 text_section->data_offset, 0,
1230 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1231 text_section->sh_num, "_etext");
1232 set_elf_sym(symtab_section,
1233 data_section->data_offset, 0,
1234 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1235 data_section->sh_num, "_edata");
1236 set_elf_sym(symtab_section,
1237 bss_section->data_offset, 0,
1238 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1239 bss_section->sh_num, "_end");
1240 #ifndef TCC_TARGET_PE
1241 /* horrible new standard ldscript defines */
1242 add_init_array_defines(s1, ".preinit_array");
1243 add_init_array_defines(s1, ".init_array");
1244 add_init_array_defines(s1, ".fini_array");
1245 #endif
1247 /* add start and stop symbols for sections whose name can be
1248 expressed in C */
1249 for(i = 1; i < s1->nb_sections; i++) {
1250 s = s1->sections[i];
1251 if (s->sh_type == SHT_PROGBITS &&
1252 (s->sh_flags & SHF_ALLOC)) {
1253 const char *p;
1254 int ch;
1256 /* check if section name can be expressed in C */
1257 p = s->name;
1258 for(;;) {
1259 ch = *p;
1260 if (!ch)
1261 break;
1262 if (!isid(ch) && !isnum(ch))
1263 goto next_sec;
1264 p++;
1266 snprintf(buf, sizeof(buf), "__start_%s", s->name);
1267 set_elf_sym(symtab_section,
1268 0, 0,
1269 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1270 s->sh_num, buf);
1271 snprintf(buf, sizeof(buf), "__stop_%s", s->name);
1272 set_elf_sym(symtab_section,
1273 s->data_offset, 0,
1274 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1275 s->sh_num, buf);
1277 next_sec: ;
1281 ST_FUNC void resolve_common_syms(TCCState *s1)
1283 ElfW(Sym) *sym;
1285 /* Allocate common symbols in BSS. */
1286 for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
1287 if (sym->st_shndx == SHN_COMMON) {
1288 /* symbol alignment is in st_value for SHN_COMMONs */
1289 sym->st_value = section_add(bss_section, sym->st_size,
1290 sym->st_value);
1291 sym->st_shndx = bss_section->sh_num;
1295 /* Now assign linker provided symbols their value. */
1296 tcc_add_linker_symbols(s1);
1299 static void tcc_output_binary(TCCState *s1, FILE *f,
1300 const int *sec_order)
1302 Section *s;
1303 int i, offset, size;
1305 offset = 0;
1306 for(i=1;i<s1->nb_sections;i++) {
1307 s = s1->sections[sec_order[i]];
1308 if (s->sh_type != SHT_NOBITS &&
1309 (s->sh_flags & SHF_ALLOC)) {
1310 while (offset < s->sh_offset) {
1311 fputc(0, f);
1312 offset++;
1314 size = s->sh_size;
1315 fwrite(s->data, 1, size, f);
1316 offset += size;
1321 ST_FUNC void fill_got_entry(TCCState *s1, ElfW_Rel *rel)
1323 int sym_index = ELFW(R_SYM) (rel->r_info);
1324 ElfW(Sym) *sym = &((ElfW(Sym) *) symtab_section->data)[sym_index];
1325 struct sym_attr *attr = get_sym_attr(s1, sym_index, 0);
1326 unsigned offset = attr->got_offset;
1328 if (0 == offset)
1329 return;
1330 section_reserve(s1->got, offset + PTR_SIZE);
1331 #ifdef TCC_TARGET_X86_64
1332 write64le(s1->got->data + offset, sym->st_value);
1333 #else
1334 write32le(s1->got->data + offset, sym->st_value);
1335 #endif
1338 /* Perform relocation to GOT or PLT entries */
1339 ST_FUNC void fill_got(TCCState *s1)
1341 Section *s;
1342 ElfW_Rel *rel;
1343 int i;
1345 for(i = 1; i < s1->nb_sections; i++) {
1346 s = s1->sections[i];
1347 if (s->sh_type != SHT_RELX)
1348 continue;
1349 /* no need to handle got relocations */
1350 if (s->link != symtab_section)
1351 continue;
1352 for_each_elem(s, 0, rel, ElfW_Rel) {
1353 switch (ELFW(R_TYPE) (rel->r_info)) {
1354 case R_X86_64_GOT32:
1355 case R_X86_64_GOTPCREL:
1356 case R_X86_64_GOTPCRELX:
1357 case R_X86_64_REX_GOTPCRELX:
1358 case R_X86_64_PLT32:
1359 fill_got_entry(s1, rel);
1360 break;
1366 /* See put_got_entry for a description. This is the second stage
1367 where GOT references to local defined symbols are rewritten. */
1368 static void fill_local_got_entries(TCCState *s1)
1370 ElfW_Rel *rel;
1371 if (!s1->got->reloc)
1372 return;
1373 for_each_elem(s1->got->reloc, 0, rel, ElfW_Rel) {
1374 if (ELFW(R_TYPE)(rel->r_info) == R_RELATIVE) {
1375 int sym_index = ELFW(R_SYM) (rel->r_info);
1376 ElfW(Sym) *sym = &((ElfW(Sym) *) symtab_section->data)[sym_index];
1377 struct sym_attr *attr = get_sym_attr(s1, sym_index, 0);
1378 unsigned offset = attr->got_offset;
1379 if (offset != rel->r_offset - s1->got->sh_addr)
1380 tcc_error_noabort("huh");
1381 rel->r_info = ELFW(R_INFO)(0, R_RELATIVE);
1382 #if SHT_RELX == SHT_RELA
1383 rel->r_addend = sym->st_value;
1384 #else
1385 /* All our REL architectures also happen to be 32bit LE. */
1386 write32le(s1->got->data + offset, sym->st_value);
1387 #endif
1392 /* Bind symbols of executable: resolve undefined symbols from exported symbols
1393 in shared libraries and export non local defined symbols to shared libraries
1394 if -rdynamic switch was given on command line */
1395 static void bind_exe_dynsyms(TCCState *s1)
1397 const char *name;
1398 int sym_index, index;
1399 ElfW(Sym) *sym, *esym;
1400 int type;
1402 /* Resolve undefined symbols from dynamic symbols. When there is a match:
1403 - if STT_FUNC or STT_GNU_IFUNC symbol -> add it in PLT
1404 - if STT_OBJECT symbol -> add it in .bss section with suitable reloc */
1405 for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
1406 if (sym->st_shndx == SHN_UNDEF) {
1407 name = (char *) symtab_section->link->data + sym->st_name;
1408 sym_index = find_elf_sym(s1->dynsymtab_section, name);
1409 if (sym_index) {
1410 esym = &((ElfW(Sym) *)s1->dynsymtab_section->data)[sym_index];
1411 type = ELFW(ST_TYPE)(esym->st_info);
1412 if ((type == STT_FUNC) || (type == STT_GNU_IFUNC)) {
1413 /* Indirect functions shall have STT_FUNC type in executable
1414 * dynsym section. Indeed, a dlsym call following a lazy
1415 * resolution would pick the symbol value from the
1416 * executable dynsym entry which would contain the address
1417 * of the function wanted by the caller of dlsym instead of
1418 * the address of the function that would return that
1419 * address */
1420 int dynindex
1421 = put_elf_sym(s1->dynsym, 0, esym->st_size,
1422 ELFW(ST_INFO)(STB_GLOBAL,STT_FUNC), 0, 0,
1423 name);
1424 int index = sym - (ElfW(Sym) *) symtab_section->data;
1425 get_sym_attr(s1, index, 1)->dyn_index = dynindex;
1426 } else if (type == STT_OBJECT) {
1427 unsigned long offset;
1428 ElfW(Sym) *dynsym;
1429 offset = bss_section->data_offset;
1430 /* XXX: which alignment ? */
1431 offset = (offset + 16 - 1) & -16;
1432 set_elf_sym (s1->symtab, offset, esym->st_size,
1433 esym->st_info, 0, bss_section->sh_num, name);
1434 index = put_elf_sym(s1->dynsym, offset, esym->st_size,
1435 esym->st_info, 0, bss_section->sh_num,
1436 name);
1438 /* Ensure R_COPY works for weak symbol aliases */
1439 if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) {
1440 for_each_elem(s1->dynsymtab_section, 1, dynsym, ElfW(Sym)) {
1441 if ((dynsym->st_value == esym->st_value)
1442 && (ELFW(ST_BIND)(dynsym->st_info) == STB_GLOBAL)) {
1443 char *dynname = (char *) s1->dynsymtab_section->link->data
1444 + dynsym->st_name;
1445 put_elf_sym(s1->dynsym, offset, dynsym->st_size,
1446 dynsym->st_info, 0,
1447 bss_section->sh_num, dynname);
1448 break;
1453 put_elf_reloc(s1->dynsym, bss_section,
1454 offset, R_COPY, index);
1455 offset += esym->st_size;
1456 bss_section->data_offset = offset;
1458 } else {
1459 /* STB_WEAK undefined symbols are accepted */
1460 /* XXX: _fp_hw seems to be part of the ABI, so we ignore it */
1461 if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK ||
1462 !strcmp(name, "_fp_hw")) {
1463 } else {
1464 tcc_error_noabort("undefined symbol '%s'", name);
1467 } else if (s1->rdynamic && ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
1468 /* if -rdynamic option, then export all non local symbols */
1469 name = (char *) symtab_section->link->data + sym->st_name;
1470 set_elf_sym(s1->dynsym, sym->st_value, sym->st_size, sym->st_info,
1471 0, sym->st_shndx, name);
1476 /* Bind symbols of libraries: export all non local symbols of executable that
1477 are referenced by shared libraries. The reason is that the dynamic loader
1478 search symbol first in executable and then in libraries. Therefore a
1479 reference to a symbol already defined by a library can still be resolved by
1480 a symbol in the executable. */
1481 static void bind_libs_dynsyms(TCCState *s1)
1483 const char *name;
1484 int sym_index;
1485 ElfW(Sym) *sym, *esym;
1487 for_each_elem(s1->dynsymtab_section, 1, esym, ElfW(Sym)) {
1488 name = (char *) s1->dynsymtab_section->link->data + esym->st_name;
1489 sym_index = find_elf_sym(symtab_section, name);
1490 sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
1491 if (sym_index && sym->st_shndx != SHN_UNDEF
1492 && ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
1493 set_elf_sym(s1->dynsym, sym->st_value, sym->st_size,
1494 sym->st_info, 0, sym->st_shndx, name);
1495 } else if (esym->st_shndx == SHN_UNDEF) {
1496 /* weak symbols can stay undefined */
1497 if (ELFW(ST_BIND)(esym->st_info) != STB_WEAK)
1498 tcc_warning("undefined dynamic symbol '%s'", name);
1503 /* Export all non local symbols. This is used by shared libraries so that the
1504 non local symbols they define can resolve a reference in another shared
1505 library or in the executable. Correspondingly, it allows undefined local
1506 symbols to be resolved by other shared libraries or by the executable. */
1507 static void export_global_syms(TCCState *s1)
1509 int dynindex, index;
1510 const char *name;
1511 ElfW(Sym) *sym;
1513 for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
1514 if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
1515 name = (char *) symtab_section->link->data + sym->st_name;
1516 dynindex = put_elf_sym(s1->dynsym, sym->st_value, sym->st_size,
1517 sym->st_info, 0, sym->st_shndx, name);
1518 index = sym - (ElfW(Sym) *) symtab_section->data;
1519 get_sym_attr(s1, index, 1)->dyn_index = dynindex;
1524 /* Allocate strings for section names and decide if an unallocated section
1525 should be output.
1526 NOTE: the strsec section comes last, so its size is also correct ! */
1527 static int alloc_sec_names(TCCState *s1, int file_type, Section *strsec)
1529 int i;
1530 Section *s;
1531 int textrel = 0;
1533 /* Allocate strings for section names */
1534 for(i = 1; i < s1->nb_sections; i++) {
1535 s = s1->sections[i];
1536 /* when generating a DLL, we include relocations but we may
1537 patch them */
1538 if (file_type == TCC_OUTPUT_DLL &&
1539 s->sh_type == SHT_RELX &&
1540 !(s->sh_flags & SHF_ALLOC) &&
1541 (s1->sections[s->sh_info]->sh_flags & SHF_ALLOC) &&
1542 prepare_dynamic_rel(s1, s)) {
1543 if (s1->sections[s->sh_info]->sh_flags & SHF_EXECINSTR)
1544 textrel = 1;
1545 } else if ((s1->do_debug && s->sh_type != SHT_RELX) ||
1546 file_type == TCC_OUTPUT_OBJ ||
1547 (s->sh_flags & SHF_ALLOC) ||
1548 i == (s1->nb_sections - 1)) {
1549 /* we output all sections if debug or object file */
1550 s->sh_size = s->data_offset;
1552 if (s->sh_size || (s->sh_flags & SHF_ALLOC))
1553 s->sh_name = put_elf_str(strsec, s->name);
1555 strsec->sh_size = strsec->data_offset;
1556 return textrel;
1559 /* Info to be copied in dynamic section */
1560 struct dyn_inf {
1561 Section *dynamic;
1562 Section *dynstr;
1563 unsigned long data_offset;
1564 addr_t rel_addr;
1565 addr_t rel_size;
1566 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
1567 addr_t bss_addr;
1568 addr_t bss_size;
1569 #endif
1572 /* Assign sections to segments and decide how are sections laid out when loaded
1573 in memory. This function also fills corresponding program headers. */
1574 static int layout_sections(TCCState *s1, ElfW(Phdr) *phdr, int phnum,
1575 Section *interp, Section* strsec,
1576 struct dyn_inf *dyninf, int *sec_order)
1578 int i, j, k, file_type, sh_order_index, file_offset;
1579 unsigned long s_align;
1580 long long tmp;
1581 addr_t addr;
1582 ElfW(Phdr) *ph;
1583 Section *s;
1585 file_type = s1->output_type;
1586 sh_order_index = 1;
1587 file_offset = 0;
1588 if (s1->output_format == TCC_OUTPUT_FORMAT_ELF)
1589 file_offset = sizeof(ElfW(Ehdr)) + phnum * sizeof(ElfW(Phdr));
1590 s_align = ELF_PAGE_SIZE;
1591 if (s1->section_align)
1592 s_align = s1->section_align;
1594 if (phnum > 0) {
1595 if (s1->has_text_addr) {
1596 int a_offset, p_offset;
1597 addr = s1->text_addr;
1598 /* we ensure that (addr % ELF_PAGE_SIZE) == file_offset %
1599 ELF_PAGE_SIZE */
1600 a_offset = (int) (addr & (s_align - 1));
1601 p_offset = file_offset & (s_align - 1);
1602 if (a_offset < p_offset)
1603 a_offset += s_align;
1604 file_offset += (a_offset - p_offset);
1605 } else {
1606 if (file_type == TCC_OUTPUT_DLL)
1607 addr = 0;
1608 else
1609 addr = ELF_START_ADDR;
1610 /* compute address after headers */
1611 addr += (file_offset & (s_align - 1));
1614 ph = &phdr[0];
1615 /* Leave one program headers for the program interpreter and one for
1616 the program header table itself if needed. These are done later as
1617 they require section layout to be done first. */
1618 if (interp)
1619 ph += 2;
1621 /* dynamic relocation table information, for .dynamic section */
1622 dyninf->rel_addr = dyninf->rel_size = 0;
1623 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
1624 dyninf->bss_addr = dyninf->bss_size = 0;
1625 #endif
1627 for(j = 0; j < 2; j++) {
1628 ph->p_type = PT_LOAD;
1629 if (j == 0)
1630 ph->p_flags = PF_R | PF_X;
1631 else
1632 ph->p_flags = PF_R | PF_W;
1633 ph->p_align = s_align;
1635 /* Decide the layout of sections loaded in memory. This must
1636 be done before program headers are filled since they contain
1637 info about the layout. We do the following ordering: interp,
1638 symbol tables, relocations, progbits, nobits */
1639 /* XXX: do faster and simpler sorting */
1640 for(k = 0; k < 5; k++) {
1641 for(i = 1; i < s1->nb_sections; i++) {
1642 s = s1->sections[i];
1643 /* compute if section should be included */
1644 if (j == 0) {
1645 if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) !=
1646 SHF_ALLOC)
1647 continue;
1648 } else {
1649 if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) !=
1650 (SHF_ALLOC | SHF_WRITE))
1651 continue;
1653 if (s == interp) {
1654 if (k != 0)
1655 continue;
1656 } else if (s->sh_type == SHT_DYNSYM ||
1657 s->sh_type == SHT_STRTAB ||
1658 s->sh_type == SHT_HASH) {
1659 if (k != 1)
1660 continue;
1661 } else if (s->sh_type == SHT_RELX) {
1662 if (k != 2)
1663 continue;
1664 } else if (s->sh_type == SHT_NOBITS) {
1665 if (k != 4)
1666 continue;
1667 } else {
1668 if (k != 3)
1669 continue;
1671 sec_order[sh_order_index++] = i;
1673 /* section matches: we align it and add its size */
1674 tmp = addr;
1675 addr = (addr + s->sh_addralign - 1) &
1676 ~(s->sh_addralign - 1);
1677 file_offset += (int) ( addr - tmp );
1678 s->sh_offset = file_offset;
1679 s->sh_addr = addr;
1681 /* update program header infos */
1682 if (ph->p_offset == 0) {
1683 ph->p_offset = file_offset;
1684 ph->p_vaddr = addr;
1685 ph->p_paddr = ph->p_vaddr;
1687 /* update dynamic relocation infos */
1688 if (s->sh_type == SHT_RELX) {
1689 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
1690 if (!strcmp(strsec->data + s->sh_name, ".rel.got")) {
1691 dyninf->rel_addr = addr;
1692 dyninf->rel_size += s->sh_size; /* XXX only first rel. */
1694 if (!strcmp(strsec->data + s->sh_name, ".rel.bss")) {
1695 dyninf->bss_addr = addr;
1696 dyninf->bss_size = s->sh_size; /* XXX only first rel. */
1698 #else
1699 if (dyninf->rel_size == 0)
1700 dyninf->rel_addr = addr;
1701 dyninf->rel_size += s->sh_size;
1702 #endif
1704 addr += s->sh_size;
1705 if (s->sh_type != SHT_NOBITS)
1706 file_offset += s->sh_size;
1709 if (j == 0) {
1710 /* Make the first PT_LOAD segment include the program
1711 headers itself (and the ELF header as well), it'll
1712 come out with same memory use but will make various
1713 tools like binutils strip work better. */
1714 ph->p_offset &= ~(ph->p_align - 1);
1715 ph->p_vaddr &= ~(ph->p_align - 1);
1716 ph->p_paddr &= ~(ph->p_align - 1);
1718 ph->p_filesz = file_offset - ph->p_offset;
1719 ph->p_memsz = addr - ph->p_vaddr;
1720 ph++;
1721 if (j == 0) {
1722 if (s1->output_format == TCC_OUTPUT_FORMAT_ELF) {
1723 /* if in the middle of a page, we duplicate the page in
1724 memory so that one copy is RX and the other is RW */
1725 if ((addr & (s_align - 1)) != 0)
1726 addr += s_align;
1727 } else {
1728 addr = (addr + s_align - 1) & ~(s_align - 1);
1729 file_offset = (file_offset + s_align - 1) & ~(s_align - 1);
1735 /* all other sections come after */
1736 for(i = 1; i < s1->nb_sections; i++) {
1737 s = s1->sections[i];
1738 if (phnum > 0 && (s->sh_flags & SHF_ALLOC))
1739 continue;
1740 sec_order[sh_order_index++] = i;
1742 file_offset = (file_offset + s->sh_addralign - 1) &
1743 ~(s->sh_addralign - 1);
1744 s->sh_offset = file_offset;
1745 if (s->sh_type != SHT_NOBITS)
1746 file_offset += s->sh_size;
1749 return file_offset;
1752 static void fill_unloadable_phdr(ElfW(Phdr) *phdr, int phnum, Section *interp,
1753 Section *dynamic)
1755 ElfW(Phdr) *ph;
1757 /* if interpreter, then add corresponding program header */
1758 if (interp) {
1759 ph = &phdr[0];
1761 ph->p_type = PT_PHDR;
1762 ph->p_offset = sizeof(ElfW(Ehdr));
1763 ph->p_filesz = ph->p_memsz = phnum * sizeof(ElfW(Phdr));
1764 ph->p_vaddr = interp->sh_addr - ph->p_filesz;
1765 ph->p_paddr = ph->p_vaddr;
1766 ph->p_flags = PF_R | PF_X;
1767 ph->p_align = 4; /* interp->sh_addralign; */
1768 ph++;
1770 ph->p_type = PT_INTERP;
1771 ph->p_offset = interp->sh_offset;
1772 ph->p_vaddr = interp->sh_addr;
1773 ph->p_paddr = ph->p_vaddr;
1774 ph->p_filesz = interp->sh_size;
1775 ph->p_memsz = interp->sh_size;
1776 ph->p_flags = PF_R;
1777 ph->p_align = interp->sh_addralign;
1780 /* if dynamic section, then add corresponding program header */
1781 if (dynamic) {
1782 ph = &phdr[phnum - 1];
1784 ph->p_type = PT_DYNAMIC;
1785 ph->p_offset = dynamic->sh_offset;
1786 ph->p_vaddr = dynamic->sh_addr;
1787 ph->p_paddr = ph->p_vaddr;
1788 ph->p_filesz = dynamic->sh_size;
1789 ph->p_memsz = dynamic->sh_size;
1790 ph->p_flags = PF_R | PF_W;
1791 ph->p_align = dynamic->sh_addralign;
1795 /* Fill the dynamic section with tags describing the address and size of
1796 sections */
1797 static void fill_dynamic(TCCState *s1, struct dyn_inf *dyninf)
1799 Section *dynamic = dyninf->dynamic;
1801 /* put dynamic section entries */
1802 put_dt(dynamic, DT_HASH, s1->dynsym->hash->sh_addr);
1803 put_dt(dynamic, DT_STRTAB, dyninf->dynstr->sh_addr);
1804 put_dt(dynamic, DT_SYMTAB, s1->dynsym->sh_addr);
1805 put_dt(dynamic, DT_STRSZ, dyninf->dynstr->data_offset);
1806 put_dt(dynamic, DT_SYMENT, sizeof(ElfW(Sym)));
1807 #if PTR_SIZE == 8
1808 put_dt(dynamic, DT_RELA, dyninf->rel_addr);
1809 put_dt(dynamic, DT_RELASZ, dyninf->rel_size);
1810 put_dt(dynamic, DT_RELAENT, sizeof(ElfW_Rel));
1811 #else
1812 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
1813 put_dt(dynamic, DT_PLTGOT, s1->got->sh_addr);
1814 put_dt(dynamic, DT_PLTRELSZ, dyninf->rel_size);
1815 put_dt(dynamic, DT_JMPREL, dyninf->rel_addr);
1816 put_dt(dynamic, DT_PLTREL, DT_REL);
1817 put_dt(dynamic, DT_REL, dyninf->bss_addr);
1818 put_dt(dynamic, DT_RELSZ, dyninf->bss_size);
1819 #else
1820 put_dt(dynamic, DT_REL, dyninf->rel_addr);
1821 put_dt(dynamic, DT_RELSZ, dyninf->rel_size);
1822 put_dt(dynamic, DT_RELENT, sizeof(ElfW_Rel));
1823 #endif
1824 #endif
1825 if (s1->do_debug)
1826 put_dt(dynamic, DT_DEBUG, 0);
1827 put_dt(dynamic, DT_NULL, 0);
1830 /* Relocate remaining sections and symbols (that is those not related to
1831 dynamic linking) */
1832 static int final_sections_reloc(TCCState *s1)
1834 int i;
1835 Section *s;
1837 relocate_syms(s1, s1->symtab, 0);
1839 if (s1->nb_errors != 0)
1840 return -1;
1842 /* relocate sections */
1843 /* XXX: ignore sections with allocated relocations ? */
1844 for(i = 1; i < s1->nb_sections; i++) {
1845 s = s1->sections[i];
1846 if (s->reloc && (s != s1->got || s1->static_link))
1847 relocate_section(s1, s);
1850 /* relocate relocation entries if the relocation tables are
1851 allocated in the executable */
1852 for(i = 1; i < s1->nb_sections; i++) {
1853 s = s1->sections[i];
1854 if ((s->sh_flags & SHF_ALLOC) &&
1855 s->sh_type == SHT_RELX) {
1856 relocate_rel(s1, s);
1859 return 0;
1862 /* Create an ELF file on disk.
1863 This function handle ELF specific layout requirements */
1864 static void tcc_output_elf(TCCState *s1, FILE *f, int phnum, ElfW(Phdr) *phdr,
1865 int file_offset, int *sec_order)
1867 int i, shnum, offset, size, file_type;
1868 Section *s;
1869 ElfW(Ehdr) ehdr;
1870 ElfW(Shdr) shdr, *sh;
1872 file_type = s1->output_type;
1873 shnum = s1->nb_sections;
1875 memset(&ehdr, 0, sizeof(ehdr));
1877 if (phnum > 0) {
1878 ehdr.e_phentsize = sizeof(ElfW(Phdr));
1879 ehdr.e_phnum = phnum;
1880 ehdr.e_phoff = sizeof(ElfW(Ehdr));
1883 /* align to 4 */
1884 file_offset = (file_offset + 3) & -4;
1886 /* fill header */
1887 ehdr.e_ident[0] = ELFMAG0;
1888 ehdr.e_ident[1] = ELFMAG1;
1889 ehdr.e_ident[2] = ELFMAG2;
1890 ehdr.e_ident[3] = ELFMAG3;
1891 ehdr.e_ident[4] = ELFCLASSW;
1892 ehdr.e_ident[5] = ELFDATA2LSB;
1893 ehdr.e_ident[6] = EV_CURRENT;
1894 #if !defined(TCC_TARGET_PE) && (defined(__FreeBSD__) || defined(__FreeBSD_kernel__))
1895 /* FIXME: should set only for freebsd _target_, but we exclude only PE target */
1896 ehdr.e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
1897 #endif
1898 #ifdef TCC_TARGET_ARM
1899 #ifdef TCC_ARM_EABI
1900 ehdr.e_ident[EI_OSABI] = 0;
1901 ehdr.e_flags = EF_ARM_EABI_VER4;
1902 if (file_type == TCC_OUTPUT_EXE || file_type == TCC_OUTPUT_DLL)
1903 ehdr.e_flags |= EF_ARM_HASENTRY;
1904 if (s1->float_abi == ARM_HARD_FLOAT)
1905 ehdr.e_flags |= EF_ARM_VFP_FLOAT;
1906 else
1907 ehdr.e_flags |= EF_ARM_SOFT_FLOAT;
1908 #else
1909 ehdr.e_ident[EI_OSABI] = ELFOSABI_ARM;
1910 #endif
1911 #endif
1912 switch(file_type) {
1913 default:
1914 case TCC_OUTPUT_EXE:
1915 ehdr.e_type = ET_EXEC;
1916 ehdr.e_entry = get_elf_sym_addr(s1, "_start", 1);
1917 break;
1918 case TCC_OUTPUT_DLL:
1919 ehdr.e_type = ET_DYN;
1920 ehdr.e_entry = text_section->sh_addr; /* XXX: is it correct ? */
1921 break;
1922 case TCC_OUTPUT_OBJ:
1923 ehdr.e_type = ET_REL;
1924 break;
1926 ehdr.e_machine = EM_TCC_TARGET;
1927 ehdr.e_version = EV_CURRENT;
1928 ehdr.e_shoff = file_offset;
1929 ehdr.e_ehsize = sizeof(ElfW(Ehdr));
1930 ehdr.e_shentsize = sizeof(ElfW(Shdr));
1931 ehdr.e_shnum = shnum;
1932 ehdr.e_shstrndx = shnum - 1;
1934 fwrite(&ehdr, 1, sizeof(ElfW(Ehdr)), f);
1935 fwrite(phdr, 1, phnum * sizeof(ElfW(Phdr)), f);
1936 offset = sizeof(ElfW(Ehdr)) + phnum * sizeof(ElfW(Phdr));
1938 sort_syms(s1, symtab_section);
1939 for(i = 1; i < s1->nb_sections; i++) {
1940 s = s1->sections[sec_order[i]];
1941 if (s->sh_type != SHT_NOBITS) {
1942 while (offset < s->sh_offset) {
1943 fputc(0, f);
1944 offset++;
1946 size = s->sh_size;
1947 if (size)
1948 fwrite(s->data, 1, size, f);
1949 offset += size;
1953 /* output section headers */
1954 while (offset < ehdr.e_shoff) {
1955 fputc(0, f);
1956 offset++;
1959 for(i = 0; i < s1->nb_sections; i++) {
1960 sh = &shdr;
1961 memset(sh, 0, sizeof(ElfW(Shdr)));
1962 s = s1->sections[i];
1963 if (s) {
1964 sh->sh_name = s->sh_name;
1965 sh->sh_type = s->sh_type;
1966 sh->sh_flags = s->sh_flags;
1967 sh->sh_entsize = s->sh_entsize;
1968 sh->sh_info = s->sh_info;
1969 if (s->link)
1970 sh->sh_link = s->link->sh_num;
1971 sh->sh_addralign = s->sh_addralign;
1972 sh->sh_addr = s->sh_addr;
1973 sh->sh_offset = s->sh_offset;
1974 sh->sh_size = s->sh_size;
1976 fwrite(sh, 1, sizeof(ElfW(Shdr)), f);
1980 /* Write an elf, coff or "binary" file */
1981 static int tcc_write_elf_file(TCCState *s1, const char *filename, int phnum,
1982 ElfW(Phdr) *phdr, int file_offset, int *sec_order)
1984 int fd, mode, file_type;
1985 FILE *f;
1987 file_type = s1->output_type;
1988 if (file_type == TCC_OUTPUT_OBJ)
1989 mode = 0666;
1990 else
1991 mode = 0777;
1992 unlink(filename);
1993 fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode);
1994 if (fd < 0) {
1995 tcc_error_noabort("could not write '%s'", filename);
1996 return -1;
1998 f = fdopen(fd, "wb");
1999 if (s1->verbose)
2000 printf("<- %s\n", filename);
2002 #ifdef TCC_TARGET_COFF
2003 if (s1->output_format == TCC_OUTPUT_FORMAT_COFF)
2004 tcc_output_coff(s1, f);
2005 else
2006 #endif
2007 if (s1->output_format == TCC_OUTPUT_FORMAT_ELF)
2008 tcc_output_elf(s1, f, phnum, phdr, file_offset, sec_order);
2009 else
2010 tcc_output_binary(s1, f, sec_order);
2011 fclose(f);
2013 return 0;
2016 /* Sort section headers by assigned sh_addr, remove sections
2017 that we aren't going to output. */
2018 static void tidy_section_headers(TCCState *s1, int *sec_order)
2020 int i, nnew, l, *backmap;
2021 Section **snew, *s;
2022 ElfW(Sym) *sym;
2024 snew = tcc_malloc(s1->nb_sections * sizeof(snew[0]));
2025 backmap = tcc_malloc(s1->nb_sections * sizeof(backmap[0]));
2026 for (i = 0, nnew = 0, l = s1->nb_sections; i < s1->nb_sections; i++) {
2027 s = s1->sections[sec_order[i]];
2028 if (!i || s->sh_name) {
2029 backmap[sec_order[i]] = nnew;
2030 snew[nnew] = s;
2031 ++nnew;
2032 } else {
2033 backmap[sec_order[i]] = 0;
2034 snew[--l] = s;
2037 for (i = 0; i < nnew; i++) {
2038 s = snew[i];
2039 if (s) {
2040 s->sh_num = i;
2041 if (s->sh_type == SHT_RELX)
2042 s->sh_info = backmap[s->sh_info];
2046 for_each_elem(symtab_section, 1, sym, ElfW(Sym))
2047 if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE)
2048 sym->st_shndx = backmap[sym->st_shndx];
2049 if( !s1->static_link ) {
2050 for_each_elem(s1->dynsym, 1, sym, ElfW(Sym))
2051 if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE)
2052 sym->st_shndx = backmap[sym->st_shndx];
2054 for (i = 0; i < s1->nb_sections; i++)
2055 sec_order[i] = i;
2056 tcc_free(s1->sections);
2057 s1->sections = snew;
2058 s1->nb_sections = nnew;
2059 tcc_free(backmap);
2062 /* Output an elf, coff or binary file */
2063 /* XXX: suppress unneeded sections */
2064 static int elf_output_file(TCCState *s1, const char *filename)
2066 int i, ret, phnum, shnum, file_type, file_offset, *sec_order;
2067 struct dyn_inf dyninf = {0};
2068 ElfW(Phdr) *phdr;
2069 ElfW(Sym) *sym;
2070 Section *strsec, *interp, *dynamic, *dynstr;
2071 int textrel;
2073 file_type = s1->output_type;
2074 s1->nb_errors = 0;
2075 ret = -1;
2076 phdr = NULL;
2077 sec_order = NULL;
2078 interp = dynamic = dynstr = NULL; /* avoid warning */
2079 textrel = 0;
2081 if (file_type != TCC_OUTPUT_OBJ) {
2082 /* if linking, also link in runtime libraries (libc, libgcc, etc.) */
2083 tcc_add_runtime(s1);
2084 resolve_common_syms(s1);
2086 if (!s1->static_link) {
2087 if (file_type == TCC_OUTPUT_EXE) {
2088 char *ptr;
2089 /* allow override the dynamic loader */
2090 const char *elfint = getenv("LD_SO");
2091 if (elfint == NULL)
2092 elfint = DEFAULT_ELFINTERP(s1);
2093 /* add interpreter section only if executable */
2094 interp = new_section(s1, ".interp", SHT_PROGBITS, SHF_ALLOC);
2095 interp->sh_addralign = 1;
2096 ptr = section_ptr_add(interp, 1 + strlen(elfint));
2097 strcpy(ptr, elfint);
2100 /* add dynamic symbol table */
2101 s1->dynsym = new_symtab(s1, ".dynsym", SHT_DYNSYM, SHF_ALLOC,
2102 ".dynstr",
2103 ".hash", SHF_ALLOC);
2104 dynstr = s1->dynsym->link;
2106 /* add dynamic section */
2107 dynamic = new_section(s1, ".dynamic", SHT_DYNAMIC,
2108 SHF_ALLOC | SHF_WRITE);
2109 dynamic->link = dynstr;
2110 dynamic->sh_entsize = sizeof(ElfW(Dyn));
2112 build_got(s1);
2114 if (file_type == TCC_OUTPUT_EXE) {
2115 bind_exe_dynsyms(s1);
2116 if (s1->nb_errors)
2117 goto the_end;
2118 bind_libs_dynsyms(s1);
2119 } else {
2120 /* shared library case: simply export all global symbols */
2121 export_global_syms(s1);
2124 build_got_entries(s1);
2127 /* we add a section for symbols */
2128 strsec = new_section(s1, ".shstrtab", SHT_STRTAB, 0);
2129 put_elf_str(strsec, "");
2131 /* Allocate strings for section names */
2132 textrel = alloc_sec_names(s1, file_type, strsec);
2134 if (dynamic) {
2135 /* add a list of needed dlls */
2136 for(i = 0; i < s1->nb_loaded_dlls; i++) {
2137 DLLReference *dllref = s1->loaded_dlls[i];
2138 if (dllref->level == 0)
2139 put_dt(dynamic, DT_NEEDED, put_elf_str(dynstr, dllref->name));
2142 if (s1->rpath)
2143 put_dt(dynamic, s1->enable_new_dtags ? DT_RUNPATH : DT_RPATH,
2144 put_elf_str(dynstr, s1->rpath));
2146 if (file_type == TCC_OUTPUT_DLL) {
2147 if (s1->soname)
2148 put_dt(dynamic, DT_SONAME, put_elf_str(dynstr, s1->soname));
2149 /* XXX: currently, since we do not handle PIC code, we
2150 must relocate the readonly segments */
2151 if (textrel)
2152 put_dt(dynamic, DT_TEXTREL, 0);
2155 if (s1->symbolic)
2156 put_dt(dynamic, DT_SYMBOLIC, 0);
2158 dyninf.dynamic = dynamic;
2159 dyninf.dynstr = dynstr;
2160 /* remember offset and reserve space for 2nd call below */
2161 dyninf.data_offset = dynamic->data_offset;
2162 fill_dynamic(s1, &dyninf);
2163 dynamic->sh_size = dynamic->data_offset;
2164 dynstr->sh_size = dynstr->data_offset;
2167 /* compute number of program headers */
2168 if (file_type == TCC_OUTPUT_OBJ)
2169 phnum = 0;
2170 else if (file_type == TCC_OUTPUT_DLL)
2171 phnum = 3;
2172 else if (s1->static_link)
2173 phnum = 2;
2174 else
2175 phnum = 5;
2177 /* allocate program segment headers */
2178 phdr = tcc_mallocz(phnum * sizeof(ElfW(Phdr)));
2180 /* compute number of sections */
2181 shnum = s1->nb_sections;
2183 /* this array is used to reorder sections in the output file */
2184 sec_order = tcc_malloc(sizeof(int) * shnum);
2185 sec_order[0] = 0;
2187 /* compute section to program header mapping */
2188 file_offset = layout_sections(s1, phdr, phnum, interp, strsec, &dyninf,
2189 sec_order);
2191 /* Fill remaining program header and finalize relocation related to dynamic
2192 linking. */
2193 if (file_type != TCC_OUTPUT_OBJ) {
2194 fill_unloadable_phdr(phdr, phnum, interp, dynamic);
2195 if (dynamic) {
2196 dynamic->data_offset = dyninf.data_offset;
2197 fill_dynamic(s1, &dyninf);
2199 /* put in GOT the dynamic section address and relocate PLT */
2200 write32le(s1->got->data, dynamic->sh_addr);
2201 if (file_type == TCC_OUTPUT_EXE
2202 || (RELOCATE_DLLPLT && file_type == TCC_OUTPUT_DLL))
2203 relocate_plt(s1);
2205 /* relocate symbols in .dynsym now that final addresses are known */
2206 for_each_elem(s1->dynsym, 1, sym, ElfW(Sym)) {
2207 if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE) {
2208 /* do symbol relocation */
2209 sym->st_value += s1->sections[sym->st_shndx]->sh_addr;
2214 /* if building executable or DLL, then relocate each section
2215 except the GOT which is already relocated */
2216 ret = final_sections_reloc(s1);
2217 if (ret)
2218 goto the_end;
2219 tidy_section_headers(s1, sec_order);
2221 /* Perform relocation to GOT or PLT entries */
2222 if (file_type == TCC_OUTPUT_EXE && s1->static_link)
2223 fill_got(s1);
2224 else if (s1->got)
2225 fill_local_got_entries(s1);
2228 /* Create the ELF file with name 'filename' */
2229 ret = tcc_write_elf_file(s1, filename, phnum, phdr, file_offset, sec_order);
2230 s1->nb_sections = shnum;
2231 the_end:
2232 tcc_free(sec_order);
2233 tcc_free(phdr);
2234 return ret;
2237 LIBTCCAPI int tcc_output_file(TCCState *s, const char *filename)
2239 int ret;
2240 #ifdef TCC_TARGET_PE
2241 if (s->output_type != TCC_OUTPUT_OBJ) {
2242 ret = pe_output_file(s, filename);
2243 } else
2244 #endif
2245 ret = elf_output_file(s, filename);
2246 return ret;
2249 ssize_t full_read(int fd, void *buf, size_t count) {
2250 char *cbuf = buf;
2251 size_t rnum = 0;
2252 while (1) {
2253 ssize_t num = read(fd, cbuf, count-rnum);
2254 if (num < 0) return num;
2255 if (num == 0) return rnum;
2256 rnum += num;
2257 cbuf += num;
2261 static void *load_data(int fd, unsigned long file_offset, unsigned long size)
2263 void *data;
2265 data = tcc_malloc(size);
2266 lseek(fd, file_offset, SEEK_SET);
2267 full_read(fd, data, size);
2268 return data;
2271 typedef struct SectionMergeInfo {
2272 Section *s; /* corresponding existing section */
2273 unsigned long offset; /* offset of the new section in the existing section */
2274 uint8_t new_section; /* true if section 's' was added */
2275 uint8_t link_once; /* true if link once section */
2276 } SectionMergeInfo;
2278 ST_FUNC int tcc_object_type(int fd, ElfW(Ehdr) *h)
2280 int size = full_read(fd, h, sizeof *h);
2281 if (size == sizeof *h && 0 == memcmp(h, ELFMAG, 4)) {
2282 if (h->e_type == ET_REL)
2283 return AFF_BINTYPE_REL;
2284 if (h->e_type == ET_DYN)
2285 return AFF_BINTYPE_DYN;
2286 } else if (size >= 8) {
2287 if (0 == memcmp(h, ARMAG, 8))
2288 return AFF_BINTYPE_AR;
2289 #ifdef TCC_TARGET_COFF
2290 if (((struct filehdr*)h)->f_magic == COFF_C67_MAGIC)
2291 return AFF_BINTYPE_C67;
2292 #endif
2294 return 0;
2297 /* load an object file and merge it with current files */
2298 /* XXX: handle correctly stab (debug) info */
2299 ST_FUNC int tcc_load_object_file(TCCState *s1,
2300 int fd, unsigned long file_offset)
2302 ElfW(Ehdr) ehdr;
2303 ElfW(Shdr) *shdr, *sh;
2304 int size, i, j, offset, offseti, nb_syms, sym_index, ret, seencompressed;
2305 unsigned char *strsec, *strtab;
2306 int *old_to_new_syms;
2307 char *sh_name, *name;
2308 SectionMergeInfo *sm_table, *sm;
2309 ElfW(Sym) *sym, *symtab;
2310 ElfW_Rel *rel;
2311 Section *s;
2313 int stab_index;
2314 int stabstr_index;
2316 stab_index = stabstr_index = 0;
2318 lseek(fd, file_offset, SEEK_SET);
2319 if (tcc_object_type(fd, &ehdr) != AFF_BINTYPE_REL)
2320 goto fail1;
2321 /* test CPU specific stuff */
2322 if (ehdr.e_ident[5] != ELFDATA2LSB ||
2323 ehdr.e_machine != EM_TCC_TARGET) {
2324 fail1:
2325 tcc_error_noabort("invalid object file");
2326 return -1;
2328 /* read sections */
2329 shdr = load_data(fd, file_offset + ehdr.e_shoff,
2330 sizeof(ElfW(Shdr)) * ehdr.e_shnum);
2331 sm_table = tcc_mallocz(sizeof(SectionMergeInfo) * ehdr.e_shnum);
2333 /* load section names */
2334 sh = &shdr[ehdr.e_shstrndx];
2335 strsec = load_data(fd, file_offset + sh->sh_offset, sh->sh_size);
2337 /* load symtab and strtab */
2338 old_to_new_syms = NULL;
2339 symtab = NULL;
2340 strtab = NULL;
2341 nb_syms = 0;
2342 seencompressed = 0;
2343 for(i = 1; i < ehdr.e_shnum; i++) {
2344 sh = &shdr[i];
2345 if (sh->sh_type == SHT_SYMTAB) {
2346 if (symtab) {
2347 tcc_error_noabort("object must contain only one symtab");
2348 fail:
2349 ret = -1;
2350 goto the_end;
2352 nb_syms = sh->sh_size / sizeof(ElfW(Sym));
2353 symtab = load_data(fd, file_offset + sh->sh_offset, sh->sh_size);
2354 sm_table[i].s = symtab_section;
2356 /* now load strtab */
2357 sh = &shdr[sh->sh_link];
2358 strtab = load_data(fd, file_offset + sh->sh_offset, sh->sh_size);
2360 if (sh->sh_flags & SHF_COMPRESSED)
2361 seencompressed = 1;
2364 /* now examine each section and try to merge its content with the
2365 ones in memory */
2366 for(i = 1; i < ehdr.e_shnum; i++) {
2367 /* no need to examine section name strtab */
2368 if (i == ehdr.e_shstrndx)
2369 continue;
2370 sh = &shdr[i];
2371 sh_name = (char *) strsec + sh->sh_name;
2372 /* ignore sections types we do not handle */
2373 if (sh->sh_type != SHT_PROGBITS &&
2374 sh->sh_type != SHT_RELX &&
2375 #ifdef TCC_ARM_EABI
2376 sh->sh_type != SHT_ARM_EXIDX &&
2377 #endif
2378 sh->sh_type != SHT_NOBITS &&
2379 sh->sh_type != SHT_PREINIT_ARRAY &&
2380 sh->sh_type != SHT_INIT_ARRAY &&
2381 sh->sh_type != SHT_FINI_ARRAY &&
2382 strcmp(sh_name, ".stabstr")
2384 continue;
2385 if (seencompressed
2386 && (!strncmp(sh_name, ".debug_", sizeof(".debug_")-1)
2387 || (sh->sh_type == SHT_RELX
2388 && !strncmp((char*)strsec + shdr[sh->sh_info].sh_name,
2389 ".debug_", sizeof(".debug_")-1))))
2390 continue;
2391 if (sh->sh_addralign < 1)
2392 sh->sh_addralign = 1;
2393 /* find corresponding section, if any */
2394 for(j = 1; j < s1->nb_sections;j++) {
2395 s = s1->sections[j];
2396 if (!strcmp(s->name, sh_name)) {
2397 if (!strncmp(sh_name, ".gnu.linkonce",
2398 sizeof(".gnu.linkonce") - 1)) {
2399 /* if a 'linkonce' section is already present, we
2400 do not add it again. It is a little tricky as
2401 symbols can still be defined in
2402 it. */
2403 sm_table[i].link_once = 1;
2404 goto next;
2405 } else {
2406 goto found;
2410 /* not found: create new section */
2411 s = new_section(s1, sh_name, sh->sh_type, sh->sh_flags & ~SHF_GROUP);
2412 /* take as much info as possible from the section. sh_link and
2413 sh_info will be updated later */
2414 s->sh_addralign = sh->sh_addralign;
2415 s->sh_entsize = sh->sh_entsize;
2416 sm_table[i].new_section = 1;
2417 found:
2418 if (sh->sh_type != s->sh_type) {
2419 tcc_error_noabort("invalid section type");
2420 goto fail;
2423 /* align start of section */
2424 offset = s->data_offset;
2426 if (0 == strcmp(sh_name, ".stab")) {
2427 stab_index = i;
2428 goto no_align;
2430 if (0 == strcmp(sh_name, ".stabstr")) {
2431 stabstr_index = i;
2432 goto no_align;
2435 size = sh->sh_addralign - 1;
2436 offset = (offset + size) & ~size;
2437 if (sh->sh_addralign > s->sh_addralign)
2438 s->sh_addralign = sh->sh_addralign;
2439 s->data_offset = offset;
2440 no_align:
2441 sm_table[i].offset = offset;
2442 sm_table[i].s = s;
2443 /* concatenate sections */
2444 size = sh->sh_size;
2445 if (sh->sh_type != SHT_NOBITS) {
2446 unsigned char *ptr;
2447 lseek(fd, file_offset + sh->sh_offset, SEEK_SET);
2448 ptr = section_ptr_add(s, size);
2449 full_read(fd, ptr, size);
2450 } else {
2451 s->data_offset += size;
2453 next: ;
2456 /* gr relocate stab strings */
2457 if (stab_index && stabstr_index) {
2458 Stab_Sym *a, *b;
2459 unsigned o;
2460 s = sm_table[stab_index].s;
2461 a = (Stab_Sym *)(s->data + sm_table[stab_index].offset);
2462 b = (Stab_Sym *)(s->data + s->data_offset);
2463 o = sm_table[stabstr_index].offset;
2464 while (a < b) {
2465 if (a->n_strx)
2466 a->n_strx += o;
2467 a++;
2471 /* second short pass to update sh_link and sh_info fields of new
2472 sections */
2473 for(i = 1; i < ehdr.e_shnum; i++) {
2474 s = sm_table[i].s;
2475 if (!s || !sm_table[i].new_section)
2476 continue;
2477 sh = &shdr[i];
2478 if (sh->sh_link > 0)
2479 s->link = sm_table[sh->sh_link].s;
2480 if (sh->sh_type == SHT_RELX) {
2481 s->sh_info = sm_table[sh->sh_info].s->sh_num;
2482 /* update backward link */
2483 s1->sections[s->sh_info]->reloc = s;
2486 sm = sm_table;
2488 /* resolve symbols */
2489 old_to_new_syms = tcc_mallocz(nb_syms * sizeof(int));
2491 sym = symtab + 1;
2492 for(i = 1; i < nb_syms; i++, sym++) {
2493 if (sym->st_shndx != SHN_UNDEF &&
2494 sym->st_shndx < SHN_LORESERVE) {
2495 sm = &sm_table[sym->st_shndx];
2496 if (sm->link_once) {
2497 /* if a symbol is in a link once section, we use the
2498 already defined symbol. It is very important to get
2499 correct relocations */
2500 if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
2501 name = (char *) strtab + sym->st_name;
2502 sym_index = find_elf_sym(symtab_section, name);
2503 if (sym_index)
2504 old_to_new_syms[i] = sym_index;
2506 continue;
2508 /* if no corresponding section added, no need to add symbol */
2509 if (!sm->s)
2510 continue;
2511 /* convert section number */
2512 sym->st_shndx = sm->s->sh_num;
2513 /* offset value */
2514 sym->st_value += sm->offset;
2516 /* add symbol */
2517 name = (char *) strtab + sym->st_name;
2518 sym_index = set_elf_sym(symtab_section, sym->st_value, sym->st_size,
2519 sym->st_info, sym->st_other,
2520 sym->st_shndx, name);
2521 old_to_new_syms[i] = sym_index;
2524 /* third pass to patch relocation entries */
2525 for(i = 1; i < ehdr.e_shnum; i++) {
2526 s = sm_table[i].s;
2527 if (!s)
2528 continue;
2529 sh = &shdr[i];
2530 offset = sm_table[i].offset;
2531 switch(s->sh_type) {
2532 case SHT_RELX:
2533 /* take relocation offset information */
2534 offseti = sm_table[sh->sh_info].offset;
2535 for_each_elem(s, (offset / sizeof(*rel)), rel, ElfW_Rel) {
2536 int type;
2537 unsigned sym_index;
2538 /* convert symbol index */
2539 type = ELFW(R_TYPE)(rel->r_info);
2540 sym_index = ELFW(R_SYM)(rel->r_info);
2541 /* NOTE: only one symtab assumed */
2542 if (sym_index >= nb_syms)
2543 goto invalid_reloc;
2544 sym_index = old_to_new_syms[sym_index];
2545 /* ignore link_once in rel section. */
2546 if (!sym_index && !sm->link_once
2547 #ifdef TCC_TARGET_ARM
2548 && type != R_ARM_V4BX
2549 #endif
2551 invalid_reloc:
2552 tcc_error_noabort("Invalid relocation entry [%2d] '%s' @ %.8x",
2553 i, strsec + sh->sh_name, rel->r_offset);
2554 goto fail;
2556 rel->r_info = ELFW(R_INFO)(sym_index, type);
2557 /* offset the relocation offset */
2558 rel->r_offset += offseti;
2559 #ifdef TCC_TARGET_ARM
2560 /* Jumps and branches from a Thumb code to a PLT entry need
2561 special handling since PLT entries are ARM code.
2562 Unconditional bl instructions referencing PLT entries are
2563 handled by converting these instructions into blx
2564 instructions. Other case of instructions referencing a PLT
2565 entry require to add a Thumb stub before the PLT entry to
2566 switch to ARM mode. We set bit plt_thumb_stub of the
2567 attribute of a symbol to indicate such a case. */
2568 if (type == R_ARM_THM_JUMP24)
2569 get_sym_attr(s1, sym_index, 1)->plt_thumb_stub = 1;
2570 #endif
2572 break;
2573 default:
2574 break;
2578 ret = 0;
2579 the_end:
2580 tcc_free(symtab);
2581 tcc_free(strtab);
2582 tcc_free(old_to_new_syms);
2583 tcc_free(sm_table);
2584 tcc_free(strsec);
2585 tcc_free(shdr);
2586 return ret;
2589 typedef struct ArchiveHeader {
2590 char ar_name[16]; /* name of this member */
2591 char ar_date[12]; /* file mtime */
2592 char ar_uid[6]; /* owner uid; printed as decimal */
2593 char ar_gid[6]; /* owner gid; printed as decimal */
2594 char ar_mode[8]; /* file mode, printed as octal */
2595 char ar_size[10]; /* file size, printed as decimal */
2596 char ar_fmag[2]; /* should contain ARFMAG */
2597 } ArchiveHeader;
2599 static int get_be32(const uint8_t *b)
2601 return b[3] | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
2604 static long get_be64(const uint8_t *b)
2606 long long ret = get_be32(b);
2607 ret = (ret << 32) | (unsigned)get_be32(b+4);
2608 return (long)ret;
2611 /* load only the objects which resolve undefined symbols */
2612 static int tcc_load_alacarte(TCCState *s1, int fd, int size, int entrysize)
2614 long i, bound, nsyms, sym_index, off, ret;
2615 uint8_t *data;
2616 const char *ar_names, *p;
2617 const uint8_t *ar_index;
2618 ElfW(Sym) *sym;
2620 data = tcc_malloc(size);
2621 if (full_read(fd, data, size) != size)
2622 goto fail;
2623 nsyms = entrysize == 4 ? get_be32(data) : get_be64(data);
2624 ar_index = data + entrysize;
2625 ar_names = (char *) ar_index + nsyms * entrysize;
2627 do {
2628 bound = 0;
2629 for(p = ar_names, i = 0; i < nsyms; i++, p += strlen(p)+1) {
2630 sym_index = find_elf_sym(symtab_section, p);
2631 if(sym_index) {
2632 sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
2633 if(sym->st_shndx == SHN_UNDEF) {
2634 off = (entrysize == 4
2635 ? get_be32(ar_index + i * 4)
2636 : get_be64(ar_index + i * 8))
2637 + sizeof(ArchiveHeader);
2638 ++bound;
2639 if(tcc_load_object_file(s1, fd, off) < 0) {
2640 fail:
2641 ret = -1;
2642 goto the_end;
2647 } while(bound);
2648 ret = 0;
2649 the_end:
2650 tcc_free(data);
2651 return ret;
2654 /* load a '.a' file */
2655 ST_FUNC int tcc_load_archive(TCCState *s1, int fd, int alacarte)
2657 ArchiveHeader hdr;
2658 char ar_size[11];
2659 char ar_name[17];
2660 char magic[8];
2661 int size, len, i;
2662 unsigned long file_offset;
2664 /* skip magic which was already checked */
2665 full_read(fd, magic, sizeof(magic));
2667 for(;;) {
2668 len = full_read(fd, &hdr, sizeof(hdr));
2669 if (len == 0)
2670 break;
2671 if (len != sizeof(hdr)) {
2672 tcc_error_noabort("invalid archive");
2673 return -1;
2675 memcpy(ar_size, hdr.ar_size, sizeof(hdr.ar_size));
2676 ar_size[sizeof(hdr.ar_size)] = '\0';
2677 size = strtol(ar_size, NULL, 0);
2678 memcpy(ar_name, hdr.ar_name, sizeof(hdr.ar_name));
2679 for(i = sizeof(hdr.ar_name) - 1; i >= 0; i--) {
2680 if (ar_name[i] != ' ')
2681 break;
2683 ar_name[i + 1] = '\0';
2684 file_offset = lseek(fd, 0, SEEK_CUR);
2685 /* align to even */
2686 size = (size + 1) & ~1;
2687 if (!strcmp(ar_name, "/")) {
2688 /* coff symbol table : we handle it */
2689 if (alacarte)
2690 return tcc_load_alacarte(s1, fd, size, 4);
2691 } else if (!strcmp(ar_name, "/SYM64/")) {
2692 if (alacarte)
2693 return tcc_load_alacarte(s1, fd, size, 8);
2694 } else {
2695 ElfW(Ehdr) ehdr;
2696 if (tcc_object_type(fd, &ehdr) == AFF_BINTYPE_REL) {
2697 if (tcc_load_object_file(s1, fd, file_offset) < 0)
2698 return -1;
2701 lseek(fd, file_offset + size, SEEK_SET);
2703 return 0;
2706 #ifndef TCC_TARGET_PE
2707 /* load a DLL and all referenced DLLs. 'level = 0' means that the DLL
2708 is referenced by the user (so it should be added as DT_NEEDED in
2709 the generated ELF file) */
2710 ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level)
2712 ElfW(Ehdr) ehdr;
2713 ElfW(Shdr) *shdr, *sh, *sh1;
2714 int i, j, nb_syms, nb_dts, sym_bind, ret;
2715 ElfW(Sym) *sym, *dynsym;
2716 ElfW(Dyn) *dt, *dynamic;
2717 unsigned char *dynstr;
2718 const char *name, *soname;
2719 DLLReference *dllref;
2721 full_read(fd, &ehdr, sizeof(ehdr));
2723 /* test CPU specific stuff */
2724 if (ehdr.e_ident[5] != ELFDATA2LSB ||
2725 ehdr.e_machine != EM_TCC_TARGET) {
2726 tcc_error_noabort("bad architecture");
2727 return -1;
2730 /* read sections */
2731 shdr = load_data(fd, ehdr.e_shoff, sizeof(ElfW(Shdr)) * ehdr.e_shnum);
2733 /* load dynamic section and dynamic symbols */
2734 nb_syms = 0;
2735 nb_dts = 0;
2736 dynamic = NULL;
2737 dynsym = NULL; /* avoid warning */
2738 dynstr = NULL; /* avoid warning */
2739 for(i = 0, sh = shdr; i < ehdr.e_shnum; i++, sh++) {
2740 switch(sh->sh_type) {
2741 case SHT_DYNAMIC:
2742 nb_dts = sh->sh_size / sizeof(ElfW(Dyn));
2743 dynamic = load_data(fd, sh->sh_offset, sh->sh_size);
2744 break;
2745 case SHT_DYNSYM:
2746 nb_syms = sh->sh_size / sizeof(ElfW(Sym));
2747 dynsym = load_data(fd, sh->sh_offset, sh->sh_size);
2748 sh1 = &shdr[sh->sh_link];
2749 dynstr = load_data(fd, sh1->sh_offset, sh1->sh_size);
2750 break;
2751 default:
2752 break;
2756 /* compute the real library name */
2757 soname = tcc_basename(filename);
2759 for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) {
2760 if (dt->d_tag == DT_SONAME) {
2761 soname = (char *) dynstr + dt->d_un.d_val;
2765 /* if the dll is already loaded, do not load it */
2766 for(i = 0; i < s1->nb_loaded_dlls; i++) {
2767 dllref = s1->loaded_dlls[i];
2768 if (!strcmp(soname, dllref->name)) {
2769 /* but update level if needed */
2770 if (level < dllref->level)
2771 dllref->level = level;
2772 ret = 0;
2773 goto the_end;
2777 /* add the dll and its level */
2778 dllref = tcc_mallocz(sizeof(DLLReference) + strlen(soname));
2779 dllref->level = level;
2780 strcpy(dllref->name, soname);
2781 dynarray_add(&s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);
2783 /* add dynamic symbols in dynsym_section */
2784 for(i = 1, sym = dynsym + 1; i < nb_syms; i++, sym++) {
2785 sym_bind = ELFW(ST_BIND)(sym->st_info);
2786 if (sym_bind == STB_LOCAL)
2787 continue;
2788 name = (char *) dynstr + sym->st_name;
2789 set_elf_sym(s1->dynsymtab_section, sym->st_value, sym->st_size,
2790 sym->st_info, sym->st_other, sym->st_shndx, name);
2793 /* load all referenced DLLs */
2794 for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) {
2795 switch(dt->d_tag) {
2796 case DT_NEEDED:
2797 name = (char *) dynstr + dt->d_un.d_val;
2798 for(j = 0; j < s1->nb_loaded_dlls; j++) {
2799 dllref = s1->loaded_dlls[j];
2800 if (!strcmp(name, dllref->name))
2801 goto already_loaded;
2803 if (tcc_add_dll(s1, name, AFF_REFERENCED_DLL) < 0) {
2804 tcc_error_noabort("referenced dll '%s' not found", name);
2805 ret = -1;
2806 goto the_end;
2808 already_loaded:
2809 break;
2812 ret = 0;
2813 the_end:
2814 tcc_free(dynstr);
2815 tcc_free(dynsym);
2816 tcc_free(dynamic);
2817 tcc_free(shdr);
2818 return ret;
2821 #define LD_TOK_NAME 256
2822 #define LD_TOK_EOF (-1)
2824 /* return next ld script token */
2825 static int ld_next(TCCState *s1, char *name, int name_size)
2827 int c;
2828 char *q;
2830 redo:
2831 switch(ch) {
2832 case ' ':
2833 case '\t':
2834 case '\f':
2835 case '\v':
2836 case '\r':
2837 case '\n':
2838 inp();
2839 goto redo;
2840 case '/':
2841 minp();
2842 if (ch == '*') {
2843 file->buf_ptr = parse_comment(file->buf_ptr);
2844 ch = file->buf_ptr[0];
2845 goto redo;
2846 } else {
2847 q = name;
2848 *q++ = '/';
2849 goto parse_name;
2851 break;
2852 case '\\':
2853 ch = handle_eob();
2854 if (ch != '\\')
2855 goto redo;
2856 /* fall through */
2857 /* case 'a' ... 'z': */
2858 case 'a':
2859 case 'b':
2860 case 'c':
2861 case 'd':
2862 case 'e':
2863 case 'f':
2864 case 'g':
2865 case 'h':
2866 case 'i':
2867 case 'j':
2868 case 'k':
2869 case 'l':
2870 case 'm':
2871 case 'n':
2872 case 'o':
2873 case 'p':
2874 case 'q':
2875 case 'r':
2876 case 's':
2877 case 't':
2878 case 'u':
2879 case 'v':
2880 case 'w':
2881 case 'x':
2882 case 'y':
2883 case 'z':
2884 /* case 'A' ... 'z': */
2885 case 'A':
2886 case 'B':
2887 case 'C':
2888 case 'D':
2889 case 'E':
2890 case 'F':
2891 case 'G':
2892 case 'H':
2893 case 'I':
2894 case 'J':
2895 case 'K':
2896 case 'L':
2897 case 'M':
2898 case 'N':
2899 case 'O':
2900 case 'P':
2901 case 'Q':
2902 case 'R':
2903 case 'S':
2904 case 'T':
2905 case 'U':
2906 case 'V':
2907 case 'W':
2908 case 'X':
2909 case 'Y':
2910 case 'Z':
2911 case '_':
2912 case '.':
2913 case '$':
2914 case '~':
2915 q = name;
2916 parse_name:
2917 for(;;) {
2918 if (!((ch >= 'a' && ch <= 'z') ||
2919 (ch >= 'A' && ch <= 'Z') ||
2920 (ch >= '0' && ch <= '9') ||
2921 strchr("/.-_+=$:\\,~", ch)))
2922 break;
2923 if ((q - name) < name_size - 1) {
2924 *q++ = ch;
2926 minp();
2928 *q = '\0';
2929 c = LD_TOK_NAME;
2930 break;
2931 case CH_EOF:
2932 c = LD_TOK_EOF;
2933 break;
2934 default:
2935 c = ch;
2936 inp();
2937 break;
2939 return c;
2942 static int ld_add_file(TCCState *s1, const char filename[])
2944 if (filename[0] == '/') {
2945 if (CONFIG_SYSROOT[0] == '\0'
2946 && tcc_add_file_internal(s1, filename, AFF_TYPE_BIN) == 0)
2947 return 0;
2948 filename = tcc_basename(filename);
2950 return tcc_add_dll(s1, filename, 0);
2953 static inline int new_undef_syms(void)
2955 int ret = 0;
2956 ret = new_undef_sym;
2957 new_undef_sym = 0;
2958 return ret;
2961 static int ld_add_file_list(TCCState *s1, const char *cmd, int as_needed)
2963 char filename[1024], libname[1024];
2964 int t, group, nblibs = 0, ret = 0;
2965 char **libs = NULL;
2967 group = !strcmp(cmd, "GROUP");
2968 if (!as_needed)
2969 new_undef_syms();
2970 t = ld_next(s1, filename, sizeof(filename));
2971 if (t != '(')
2972 expect("(");
2973 t = ld_next(s1, filename, sizeof(filename));
2974 for(;;) {
2975 libname[0] = '\0';
2976 if (t == LD_TOK_EOF) {
2977 tcc_error_noabort("unexpected end of file");
2978 ret = -1;
2979 goto lib_parse_error;
2980 } else if (t == ')') {
2981 break;
2982 } else if (t == '-') {
2983 t = ld_next(s1, filename, sizeof(filename));
2984 if ((t != LD_TOK_NAME) || (filename[0] != 'l')) {
2985 tcc_error_noabort("library name expected");
2986 ret = -1;
2987 goto lib_parse_error;
2989 pstrcpy(libname, sizeof libname, &filename[1]);
2990 if (s1->static_link) {
2991 snprintf(filename, sizeof filename, "lib%s.a", libname);
2992 } else {
2993 snprintf(filename, sizeof filename, "lib%s.so", libname);
2995 } else if (t != LD_TOK_NAME) {
2996 tcc_error_noabort("filename expected");
2997 ret = -1;
2998 goto lib_parse_error;
3000 if (!strcmp(filename, "AS_NEEDED")) {
3001 ret = ld_add_file_list(s1, cmd, 1);
3002 if (ret)
3003 goto lib_parse_error;
3004 } else {
3005 /* TODO: Implement AS_NEEDED support. Ignore it for now */
3006 if (!as_needed) {
3007 ret = ld_add_file(s1, filename);
3008 if (ret)
3009 goto lib_parse_error;
3010 if (group) {
3011 /* Add the filename *and* the libname to avoid future conversions */
3012 dynarray_add(&libs, &nblibs, tcc_strdup(filename));
3013 if (libname[0] != '\0')
3014 dynarray_add(&libs, &nblibs, tcc_strdup(libname));
3018 t = ld_next(s1, filename, sizeof(filename));
3019 if (t == ',') {
3020 t = ld_next(s1, filename, sizeof(filename));
3023 if (group && !as_needed) {
3024 while (new_undef_syms()) {
3025 int i;
3027 for (i = 0; i < nblibs; i ++)
3028 ld_add_file(s1, libs[i]);
3031 lib_parse_error:
3032 dynarray_reset(&libs, &nblibs);
3033 return ret;
3036 /* interpret a subset of GNU ldscripts to handle the dummy libc.so
3037 files */
3038 ST_FUNC int tcc_load_ldscript(TCCState *s1)
3040 char cmd[64];
3041 char filename[1024];
3042 int t, ret;
3044 ch = handle_eob();
3045 for(;;) {
3046 t = ld_next(s1, cmd, sizeof(cmd));
3047 if (t == LD_TOK_EOF)
3048 return 0;
3049 else if (t != LD_TOK_NAME)
3050 return -1;
3051 if (!strcmp(cmd, "INPUT") ||
3052 !strcmp(cmd, "GROUP")) {
3053 ret = ld_add_file_list(s1, cmd, 0);
3054 if (ret)
3055 return ret;
3056 } else if (!strcmp(cmd, "OUTPUT_FORMAT") ||
3057 !strcmp(cmd, "TARGET")) {
3058 /* ignore some commands */
3059 t = ld_next(s1, cmd, sizeof(cmd));
3060 if (t != '(')
3061 expect("(");
3062 for(;;) {
3063 t = ld_next(s1, filename, sizeof(filename));
3064 if (t == LD_TOK_EOF) {
3065 tcc_error_noabort("unexpected end of file");
3066 return -1;
3067 } else if (t == ')') {
3068 break;
3071 } else {
3072 return -1;
3075 return 0;
3077 #endif /* !TCC_TARGET_PE */