2 * ELF file handling for TCC
4 * Copyright (c) 2001, 2002 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 static int put_elf_str(Section
*s
, const char *sym
)
26 len
= strlen(sym
) + 1;
27 offset
= s
->data_offset
;
28 ptr
= section_ptr_add(s
, len
);
29 memcpy(ptr
, sym
, len
);
33 /* elf symbol hashing function */
34 static unsigned long elf_hash(const unsigned char *name
)
36 unsigned long h
= 0, g
;
39 h
= (h
<< 4) + *name
++;
48 /* rebuild hash table of section s */
49 /* NOTE: we do factorize the hash table code to go faster */
50 static void rebuild_hash(Section
*s
, unsigned int nb_buckets
)
53 int *ptr
, *hash
, nb_syms
, sym_index
, h
;
56 strtab
= s
->link
->data
;
57 nb_syms
= s
->data_offset
/ sizeof(Elf32_Sym
);
59 s
->hash
->data_offset
= 0;
60 ptr
= section_ptr_add(s
->hash
, (2 + nb_buckets
+ nb_syms
) * sizeof(int));
65 memset(hash
, 0, (nb_buckets
+ 1) * sizeof(int));
66 ptr
+= nb_buckets
+ 1;
68 sym
= (Elf32_Sym
*)s
->data
+ 1;
69 for(sym_index
= 1; sym_index
< nb_syms
; sym_index
++) {
70 if (ELF32_ST_BIND(sym
->st_info
) != STB_LOCAL
) {
71 h
= elf_hash(strtab
+ sym
->st_name
) % nb_buckets
;
82 /* return the symbol number */
83 static int put_elf_sym(Section
*s
,
84 unsigned long value
, unsigned long size
,
85 int info
, int other
, int shndx
, const char *name
)
87 int name_offset
, sym_index
;
92 sym
= section_ptr_add(s
, sizeof(Elf32_Sym
));
94 name_offset
= put_elf_str(s
->link
, name
);
98 sym
->st_name
= name_offset
;
99 sym
->st_value
= value
;
102 sym
->st_other
= other
;
103 sym
->st_shndx
= shndx
;
104 sym_index
= sym
- (Elf32_Sym
*)s
->data
;
108 ptr
= section_ptr_add(hs
, sizeof(int));
109 base
= (int *)hs
->data
;
110 /* only add global or weak symbols */
111 if (ELF32_ST_BIND(info
) != STB_LOCAL
) {
112 /* add another hashing entry */
114 h
= elf_hash(name
) % nbuckets
;
116 base
[2 + h
] = sym_index
;
118 /* we resize the hash table */
119 hs
->nb_hashed_syms
++;
120 if (hs
->nb_hashed_syms
> 2 * nbuckets
) {
121 rebuild_hash(s
, 2 * nbuckets
);
131 /* find global ELF symbol 'name' and return its index. Return 0 if not
133 static int find_elf_sym(Section
*s
, const char *name
)
137 int nbuckets
, sym_index
, h
;
143 nbuckets
= ((int *)hs
->data
)[0];
144 h
= elf_hash(name
) % nbuckets
;
145 sym_index
= ((int *)hs
->data
)[2 + h
];
146 while (sym_index
!= 0) {
147 sym
= &((Elf32_Sym
*)s
->data
)[sym_index
];
148 name1
= s
->link
->data
+ sym
->st_name
;
149 if (!strcmp(name
, name1
))
151 sym_index
= ((int *)hs
->data
)[2 + nbuckets
+ sym_index
];
156 /* return elf symbol value or error */
157 int tcc_get_symbol(TCCState
*s
, unsigned long *pval
, const char *name
)
162 sym_index
= find_elf_sym(symtab_section
, name
);
165 sym
= &((Elf32_Sym
*)symtab_section
->data
)[sym_index
];
166 *pval
= sym
->st_value
;
170 void *tcc_get_symbol_err(TCCState
*s
, const char *name
)
173 if (tcc_get_symbol(s
, &val
, name
) < 0)
174 error("%s not defined", name
);
178 /* add an elf symbol : check if it is already defined and patch
179 it. Return symbol index. NOTE that sh_num can be SHN_UNDEF. */
180 static int add_elf_sym(Section
*s
, unsigned long value
, unsigned long size
,
181 int info
, int sh_num
, const char *name
)
184 int sym_bind
, sym_index
, sym_type
, esym_bind
;
186 sym_bind
= ELF32_ST_BIND(info
);
187 sym_type
= ELF32_ST_TYPE(info
);
189 if (sym_bind
!= STB_LOCAL
) {
190 /* we search global or weak symbols */
191 sym_index
= find_elf_sym(s
, name
);
194 esym
= &((Elf32_Sym
*)s
->data
)[sym_index
];
195 if (esym
->st_shndx
!= SHN_UNDEF
) {
196 esym_bind
= ELF32_ST_BIND(esym
->st_info
);
197 if (sh_num
== SHN_UNDEF
) {
198 /* ignore adding of undefined symbol if the
199 corresponding symbol is already defined */
200 } else if (sym_bind
== STB_GLOBAL
&& esym_bind
== STB_WEAK
) {
201 /* global overrides weak, so patch */
203 } else if (sym_bind
== STB_WEAK
&& esym_bind
== STB_GLOBAL
) {
204 /* weak is ignored if already global */
207 printf("new_bind=%d new_shndx=%d last_bind=%d old_shndx=%d\n",
208 sym_bind
, sh_num
, esym_bind
, esym
->st_shndx
);
210 /* NOTE: we accept that two DLL define the same symbol */
211 if (s
!= tcc_state
->dynsymtab_section
)
212 error_noabort("'%s' defined twice", name
);
216 esym
->st_info
= ELF32_ST_INFO(sym_bind
, sym_type
);
217 esym
->st_shndx
= sh_num
;
218 esym
->st_value
= value
;
219 esym
->st_size
= size
;
223 sym_index
= put_elf_sym(s
, value
, size
,
224 ELF32_ST_INFO(sym_bind
, sym_type
), 0,
231 static void put_elf_reloc(Section
*symtab
, Section
*s
, unsigned long offset
,
232 int type
, int symbol
)
240 /* if no relocation section, create it */
241 snprintf(buf
, sizeof(buf
), ".rel%s", s
->name
);
242 /* if the symtab is allocated, then we consider the relocation
244 sr
= new_section(tcc_state
, buf
, SHT_REL
, symtab
->sh_flags
);
245 sr
->sh_entsize
= sizeof(Elf32_Rel
);
247 sr
->sh_info
= s
->sh_num
;
250 rel
= section_ptr_add(sr
, sizeof(Elf32_Rel
));
251 rel
->r_offset
= offset
;
252 rel
->r_info
= ELF32_R_INFO(symbol
, type
);
255 /* put stab debug information */
258 unsigned long n_strx
; /* index into string table of name */
259 unsigned char n_type
; /* type of symbol */
260 unsigned char n_other
; /* misc info (usually empty) */
261 unsigned short n_desc
; /* description field */
262 unsigned long n_value
; /* value of symbol */
265 static void put_stabs(const char *str
, int type
, int other
, int desc
,
270 sym
= section_ptr_add(stab_section
, sizeof(Stab_Sym
));
272 sym
->n_strx
= put_elf_str(stabstr_section
, str
);
277 sym
->n_other
= other
;
279 sym
->n_value
= value
;
282 static void put_stabs_r(const char *str
, int type
, int other
, int desc
,
283 unsigned long value
, Section
*sec
, int sym_index
)
285 put_stabs(str
, type
, other
, desc
, value
);
286 put_elf_reloc(symtab_section
, stab_section
,
287 stab_section
->data_offset
- sizeof(unsigned long),
288 R_DATA_32
, sym_index
);
291 static void put_stabn(int type
, int other
, int desc
, int value
)
293 put_stabs(NULL
, type
, other
, desc
, value
);
296 static void put_stabd(int type
, int other
, int desc
)
298 put_stabs(NULL
, type
, other
, desc
, 0);
301 /* In an ELF file symbol table, the local symbols must appear below
302 the global and weak ones. Since TCC cannot sort it while generating
303 the code, we must do it after. All the relocation tables are also
304 modified to take into account the symbol table sorting */
305 static void sort_syms(TCCState
*s1
, Section
*s
)
307 int *old_to_new_syms
;
311 Elf32_Rel
*rel
, *rel_end
;
315 nb_syms
= s
->data_offset
/ sizeof(Elf32_Sym
);
316 new_syms
= tcc_malloc(nb_syms
* sizeof(Elf32_Sym
));
317 old_to_new_syms
= tcc_malloc(nb_syms
* sizeof(int));
319 /* first pass for local symbols */
320 p
= (Elf32_Sym
*)s
->data
;
322 for(i
= 0; i
< nb_syms
; i
++) {
323 if (ELF32_ST_BIND(p
->st_info
) == STB_LOCAL
) {
324 old_to_new_syms
[i
] = q
- new_syms
;
329 /* save the number of local symbols in section header */
330 s
->sh_info
= q
- new_syms
;
332 /* then second pass for non local symbols */
333 p
= (Elf32_Sym
*)s
->data
;
334 for(i
= 0; i
< nb_syms
; i
++) {
335 if (ELF32_ST_BIND(p
->st_info
) != STB_LOCAL
) {
336 old_to_new_syms
[i
] = q
- new_syms
;
342 /* we copy the new symbols to the old */
343 memcpy(s
->data
, new_syms
, nb_syms
* sizeof(Elf32_Sym
));
346 /* now we modify all the relocations */
347 for(i
= 1; i
< s1
->nb_sections
; i
++) {
348 sr
= s1
->sections
[i
];
349 if (sr
->sh_type
== SHT_REL
&& sr
->link
== s
) {
350 rel_end
= (Elf32_Rel
*)(sr
->data
+ sr
->data_offset
);
351 for(rel
= (Elf32_Rel
*)sr
->data
;
354 sym_index
= ELF32_R_SYM(rel
->r_info
);
355 type
= ELF32_R_TYPE(rel
->r_info
);
356 sym_index
= old_to_new_syms
[sym_index
];
357 rel
->r_info
= ELF32_R_INFO(sym_index
, type
);
362 tcc_free(old_to_new_syms
);
365 /* relocate common symbols in the .bss section */
366 static void relocate_common_syms(void)
368 Elf32_Sym
*sym
, *sym_end
;
369 unsigned long offset
, align
;
371 sym_end
= (Elf32_Sym
*)(symtab_section
->data
+ symtab_section
->data_offset
);
372 for(sym
= (Elf32_Sym
*)symtab_section
->data
+ 1;
375 if (sym
->st_shndx
== SHN_COMMON
) {
377 align
= sym
->st_value
;
378 offset
= bss_section
->data_offset
;
379 offset
= (offset
+ align
- 1) & -align
;
380 sym
->st_value
= offset
;
381 sym
->st_shndx
= bss_section
->sh_num
;
382 offset
+= sym
->st_size
;
383 bss_section
->data_offset
= offset
;
388 static void *resolve_sym(const char *sym
)
390 return dlsym(RTLD_DEFAULT
, sym
);
393 /* relocate symbol table, resolve undefined symbols if do_resolve is
394 true and output error if undefined symbol. */
395 static void relocate_syms(TCCState
*s1
, int do_resolve
)
397 Elf32_Sym
*sym
, *esym
, *sym_end
;
398 int sym_bind
, sh_num
, sym_index
;
402 sym_end
= (Elf32_Sym
*)(symtab_section
->data
+ symtab_section
->data_offset
);
403 for(sym
= (Elf32_Sym
*)symtab_section
->data
+ 1;
406 sh_num
= sym
->st_shndx
;
407 if (sh_num
== SHN_UNDEF
) {
408 name
= strtab_section
->data
+ sym
->st_name
;
410 name
= symtab_section
->link
->data
+ sym
->st_name
;
411 addr
= (unsigned long)resolve_sym(name
);
413 sym
->st_value
= addr
;
416 } else if (s1
->dynsym
) {
417 /* if dynamic symbol exist, then use it */
418 sym_index
= find_elf_sym(s1
->dynsym
, name
);
420 esym
= &((Elf32_Sym
*)s1
->dynsym
->data
)[sym_index
];
421 sym
->st_value
= esym
->st_value
;
425 /* XXX: _fp_hw seems to be part of the ABI, so we ignore
427 if (!strcmp(name
, "_fp_hw"))
429 /* only weak symbols are accepted to be undefined. Their
431 sym_bind
= ELF32_ST_BIND(sym
->st_info
);
432 if (sym_bind
== STB_WEAK
) {
435 error_noabort("undefined symbol '%s'", name
);
437 } else if (sh_num
< SHN_LORESERVE
) {
438 /* add section base */
439 sym
->st_value
+= s1
->sections
[sym
->st_shndx
]->sh_addr
;
445 /* relocate a given section (CPU dependent) */
446 static void relocate_section(TCCState
*s1
, Section
*s
)
449 Elf32_Rel
*rel
, *rel_end
, *qrel
;
451 int type
, sym_index
, esym_index
;
453 unsigned long val
, addr
;
456 rel_end
= (Elf32_Rel
*)(sr
->data
+ sr
->data_offset
);
457 qrel
= (Elf32_Rel
*)sr
->data
;
461 ptr
= s
->data
+ rel
->r_offset
;
463 sym_index
= ELF32_R_SYM(rel
->r_info
);
464 sym
= &((Elf32_Sym
*)symtab_section
->data
)[sym_index
];
466 type
= ELF32_R_TYPE(rel
->r_info
);
467 addr
= s
->sh_addr
+ rel
->r_offset
;
472 if (s1
->output_type
== TCC_OUTPUT_DLL
) {
473 esym_index
= s1
->symtab_to_dynsym
[sym_index
];
474 qrel
->r_offset
= rel
->r_offset
;
476 qrel
->r_info
= ELF32_R_INFO(esym_index
, R_386_32
);
480 qrel
->r_info
= ELF32_R_INFO(0, R_386_RELATIVE
);
487 if (s1
->output_type
== TCC_OUTPUT_DLL
) {
489 esym_index
= s1
->symtab_to_dynsym
[sym_index
];
491 qrel
->r_offset
= rel
->r_offset
;
492 qrel
->r_info
= ELF32_R_INFO(esym_index
, R_386_PC32
);
497 *(int *)ptr
+= val
- addr
;
500 *(int *)ptr
+= val
- addr
;
507 *(int *)ptr
+= s1
->got
->sh_addr
- addr
;
510 *(int *)ptr
+= val
- s1
->got
->sh_addr
;
513 /* we load the got offset */
514 *(int *)ptr
+= s1
->got_offsets
[sym_index
];
518 /* if the relocation is allocated, we change its symbol table */
519 if (sr
->sh_flags
& SHF_ALLOC
)
520 sr
->link
= s1
->dynsym
;
523 /* relocate relocation table in 'sr' */
524 static void relocate_rel(TCCState
*s1
, Section
*sr
)
527 Elf32_Rel
*rel
, *rel_end
;
529 s
= s1
->sections
[sr
->sh_info
];
530 rel_end
= (Elf32_Rel
*)(sr
->data
+ sr
->data_offset
);
531 for(rel
= (Elf32_Rel
*)sr
->data
;
534 rel
->r_offset
+= s
->sh_addr
;
538 /* count the number of dynamic relocations so that we can reserve
540 static int prepare_dynamic_rel(TCCState
*s1
, Section
*sr
)
542 Elf32_Rel
*rel
, *rel_end
;
543 int sym_index
, esym_index
, type
, count
;
546 rel_end
= (Elf32_Rel
*)(sr
->data
+ sr
->data_offset
);
547 for(rel
= (Elf32_Rel
*)sr
->data
; rel
< rel_end
; rel
++) {
548 sym_index
= ELF32_R_SYM(rel
->r_info
);
549 type
= ELF32_R_TYPE(rel
->r_info
);
555 esym_index
= s1
->symtab_to_dynsym
[sym_index
];
564 /* allocate the section */
565 sr
->sh_flags
|= SHF_ALLOC
;
566 sr
->sh_size
= count
* sizeof(Elf32_Rel
);
571 static void put_got_offset(TCCState
*s1
, int index
, unsigned long val
)
576 if (index
>= s1
->nb_got_offsets
) {
577 /* find immediately bigger power of 2 and reallocate array */
581 tab
= tcc_realloc(s1
->got_offsets
, n
* sizeof(unsigned long));
583 error("memory full");
584 s1
->got_offsets
= tab
;
585 memset(s1
->got_offsets
+ s1
->nb_got_offsets
, 0,
586 (n
- s1
->nb_got_offsets
) * sizeof(unsigned long));
587 s1
->nb_got_offsets
= n
;
589 s1
->got_offsets
[index
] = val
;
592 /* XXX: suppress that */
593 static void put32(unsigned char *p
, uint32_t val
)
601 static uint32_t get32(unsigned char *p
)
603 return p
[0] | (p
[1] << 8) | (p
[2] << 16) | (p
[3] << 24);
606 static void build_got(TCCState
*s1
)
610 /* if no got, then create it */
611 s1
->got
= new_section(s1
, ".got", SHT_PROGBITS
, SHF_ALLOC
| SHF_WRITE
);
612 s1
->got
->sh_entsize
= 4;
613 add_elf_sym(symtab_section
, 0, 4, ELF32_ST_INFO(STB_GLOBAL
, STT_OBJECT
),
614 s1
->got
->sh_num
, "_GLOBAL_OFFSET_TABLE_");
615 ptr
= section_ptr_add(s1
->got
, 3 * sizeof(int));
616 /* keep space for _DYNAMIC pointer, if present */
618 /* two dummy got entries */
623 /* put a got entry corresponding to a symbol in symtab_section. 'size'
624 and 'info' can be modifed if more precise info comes from the DLL */
625 static void put_got_entry(TCCState
*s1
,
626 int reloc_type
, unsigned long size
, int info
,
632 unsigned long offset
;
638 /* if a got entry already exists for that symbol, no need to add one */
639 if (sym_index
< s1
->nb_got_offsets
&&
640 s1
->got_offsets
[sym_index
] != 0)
643 put_got_offset(s1
, sym_index
, s1
->got
->data_offset
);
646 sym
= &((Elf32_Sym
*)symtab_section
->data
)[sym_index
];
647 name
= symtab_section
->link
->data
+ sym
->st_name
;
648 offset
= sym
->st_value
;
649 if (reloc_type
== R_386_JMP_SLOT
) {
654 /* if we build a DLL, we add a %ebx offset */
655 if (s1
->output_type
== TCC_OUTPUT_DLL
)
660 /* add a PLT entry */
662 if (plt
->data_offset
== 0) {
663 /* first plt entry */
664 p
= section_ptr_add(plt
, 16);
665 p
[0] = 0xff; /* pushl got + 4 */
668 p
[6] = 0xff; /* jmp *(got + 8) */
673 p
= section_ptr_add(plt
, 16);
674 p
[0] = 0xff; /* jmp *(got + x) */
676 put32(p
+ 2, s1
->got
->data_offset
);
677 p
[6] = 0x68; /* push $xxx */
678 put32(p
+ 7, (plt
->data_offset
- 32) >> 1);
679 p
[11] = 0xe9; /* jmp plt_start */
680 put32(p
+ 12, -(plt
->data_offset
));
682 /* the symbol is modified so that it will be relocated to
684 if (s1
->output_type
== TCC_OUTPUT_EXE
)
685 offset
= plt
->data_offset
- 16;
687 index
= put_elf_sym(s1
->dynsym
, offset
,
688 size
, info
, 0, sym
->st_shndx
, name
);
689 /* put a got entry */
690 put_elf_reloc(s1
->dynsym
, s1
->got
,
691 s1
->got
->data_offset
,
694 ptr
= section_ptr_add(s1
->got
, sizeof(int));
698 /* build GOT and PLT entries */
699 static void build_got_entries(TCCState
*s1
)
702 Elf32_Rel
*rel
, *rel_end
;
704 int i
, type
, reloc_type
, sym_index
;
706 for(i
= 1; i
< s1
->nb_sections
; i
++) {
708 if (s
->sh_type
!= SHT_REL
)
710 /* no need to handle got relocations */
711 if (s
->link
!= symtab_section
)
714 rel_end
= (Elf32_Rel
*)(s
->data
+ s
->data_offset
);
715 for(rel
= (Elf32_Rel
*)s
->data
;
718 type
= ELF32_R_TYPE(rel
->r_info
);
726 if (type
== R_386_GOT32
|| type
== R_386_PLT32
) {
727 sym_index
= ELF32_R_SYM(rel
->r_info
);
728 sym
= &((Elf32_Sym
*)symtab_section
->data
)[sym_index
];
729 /* look at the symbol got offset. If none, then add one */
730 if (type
== R_386_GOT32
)
731 reloc_type
= R_386_GLOB_DAT
;
733 reloc_type
= R_386_JMP_SLOT
;
734 put_got_entry(s1
, reloc_type
, sym
->st_size
, sym
->st_info
,
745 static Section
*new_symtab(TCCState
*s1
,
746 const char *symtab_name
, int sh_type
, int sh_flags
,
747 const char *strtab_name
,
748 const char *hash_name
, int hash_sh_flags
)
750 Section
*symtab
, *strtab
, *hash
;
751 int *ptr
, nb_buckets
;
753 symtab
= new_section(s1
, symtab_name
, sh_type
, sh_flags
);
754 symtab
->sh_entsize
= sizeof(Elf32_Sym
);
755 strtab
= new_section(s1
, strtab_name
, SHT_STRTAB
, sh_flags
);
756 put_elf_str(strtab
, "");
757 symtab
->link
= strtab
;
758 put_elf_sym(symtab
, 0, 0, 0, 0, 0, NULL
);
762 hash
= new_section(s1
, hash_name
, SHT_HASH
, hash_sh_flags
);
763 hash
->sh_entsize
= sizeof(int);
767 ptr
= section_ptr_add(hash
, (2 + nb_buckets
+ 1) * sizeof(int));
770 memset(ptr
+ 2, 0, (nb_buckets
+ 1) * sizeof(int));
774 /* put dynamic tag */
775 static void put_dt(Section
*dynamic
, int dt
, unsigned long val
)
778 dyn
= section_ptr_add(dynamic
, sizeof(Elf32_Dyn
));
780 dyn
->d_un
.d_val
= val
;
783 static void add_init_array_defines(TCCState
*s1
, const char *section_name
)
787 char sym_start
[1024];
790 snprintf(sym_start
, sizeof(sym_start
), "__%s_start", section_name
+ 1);
791 snprintf(sym_end
, sizeof(sym_end
), "__%s_end", section_name
+ 1);
793 s
= find_section(s1
, section_name
);
798 end_offset
= s
->data_offset
;
801 add_elf_sym(symtab_section
,
803 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
804 s
->sh_num
, sym_start
);
805 add_elf_sym(symtab_section
,
807 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
811 /* add tcc runtime libraries */
812 static void tcc_add_runtime(TCCState
*s1
)
819 snprintf(buf
, sizeof(buf
), "%s/%s", tcc_lib_path
, "libtcc1.a");
820 tcc_add_file(s1
, buf
);
822 #ifdef CONFIG_TCC_BCHECK
823 if (do_bounds_check
) {
825 Section
*init_section
;
826 unsigned char *pinit
;
829 /* XXX: add an object file to do that */
830 ptr
= section_ptr_add(bounds_section
, sizeof(unsigned long));
832 add_elf_sym(symtab_section
, 0, 0,
833 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
834 bounds_section
->sh_num
, "__bounds_start");
835 /* add bound check code */
836 snprintf(buf
, sizeof(buf
), "%s/%s", tcc_lib_path
, "bcheck.o");
837 tcc_add_file(s1
, buf
);
838 #ifdef TCC_TARGET_I386
839 if (s1
->output_type
!= TCC_OUTPUT_MEMORY
) {
840 /* add 'call __bound_init()' in .init section */
841 init_section
= find_section(s1
, ".init");
842 pinit
= section_ptr_add(init_section
, 5);
844 put32(pinit
+ 1, -4);
845 sym_index
= find_elf_sym(symtab_section
, "__bound_init");
846 put_elf_reloc(symtab_section
, init_section
,
847 init_section
->data_offset
- 4, R_386_PC32
, sym_index
);
854 tcc_add_library(s1
, "c");
856 /* add crt end if not memory output */
857 if (s1
->output_type
!= TCC_OUTPUT_MEMORY
&& !s1
->nostdlib
) {
858 tcc_add_file(s1
, CONFIG_TCC_CRT_PREFIX
"/crtn.o");
860 /* add various standard linker symbols */
861 add_elf_sym(symtab_section
,
862 text_section
->data_offset
, 0,
863 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
864 text_section
->sh_num
, "_etext");
865 add_elf_sym(symtab_section
,
866 data_section
->data_offset
, 0,
867 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
868 data_section
->sh_num
, "_edata");
869 add_elf_sym(symtab_section
,
870 bss_section
->data_offset
, 0,
871 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
872 bss_section
->sh_num
, "_end");
873 /* horrible new standard ldscript defines */
874 add_init_array_defines(s1
, ".preinit_array");
875 add_init_array_defines(s1
, ".init_array");
876 add_init_array_defines(s1
, ".fini_array");
878 /* add start and stop symbols for sections whose name can be
880 for(i
= 1; i
< s1
->nb_sections
; i
++) {
882 if (s
->sh_type
== SHT_PROGBITS
&&
883 (s
->sh_flags
& SHF_ALLOC
)) {
887 /* check if section name can be expressed in C */
893 if (!isid(ch
) && !isnum(ch
))
897 snprintf(buf
, sizeof(buf
), "__start_%s", s
->name
);
898 add_elf_sym(symtab_section
,
900 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
902 snprintf(buf
, sizeof(buf
), "__stop_%s", s
->name
);
903 add_elf_sym(symtab_section
,
905 ELF32_ST_INFO(STB_GLOBAL
, STT_NOTYPE
),
912 /* name of ELF interpreter */
914 static char elf_interp
[] = "/usr/libexec/ld-elf.so.1";
916 static char elf_interp
[] = "/lib/ld-linux.so.2";
919 #define ELF_START_ADDR 0x08048000
920 #define ELF_PAGE_SIZE 0x1000
922 /* output an ELF file */
923 /* XXX: suppress unneeded sections */
924 int tcc_output_file(TCCState
*s1
, const char *filename
)
930 int shnum
, i
, phnum
, file_offset
, offset
, size
, j
, tmp
, sh_order_index
, k
;
933 Elf32_Shdr shdr
, *sh
;
934 Elf32_Phdr
*phdr
, *ph
;
935 Section
*interp
, *dynamic
, *dynstr
;
936 unsigned long saved_dynamic_data_offset
;
939 unsigned long rel_addr
, rel_size
;
941 file_type
= s1
->output_type
;
944 if (file_type
!= TCC_OUTPUT_OBJ
)
948 section_order
= NULL
;
951 dynstr
= NULL
; /* avoid warning */
952 saved_dynamic_data_offset
= 0; /* avoid warning */
954 if (file_type
!= TCC_OUTPUT_OBJ
) {
956 relocate_common_syms();
958 if (!s1
->static_link
) {
960 int sym_index
, index
;
961 Elf32_Sym
*esym
, *sym_end
;
963 if (file_type
== TCC_OUTPUT_EXE
) {
965 /* add interpreter section only if executable */
966 interp
= new_section(s1
, ".interp", SHT_PROGBITS
, SHF_ALLOC
);
967 interp
->sh_addralign
= 1;
968 ptr
= section_ptr_add(interp
, sizeof(elf_interp
));
969 strcpy(ptr
, elf_interp
);
972 /* add dynamic symbol table */
973 s1
->dynsym
= new_symtab(s1
, ".dynsym", SHT_DYNSYM
, SHF_ALLOC
,
976 dynstr
= s1
->dynsym
->link
;
978 /* add dynamic section */
979 dynamic
= new_section(s1
, ".dynamic", SHT_DYNAMIC
,
980 SHF_ALLOC
| SHF_WRITE
);
981 dynamic
->link
= dynstr
;
982 dynamic
->sh_entsize
= sizeof(Elf32_Dyn
);
985 s1
->plt
= new_section(s1
, ".plt", SHT_PROGBITS
,
986 SHF_ALLOC
| SHF_EXECINSTR
);
987 s1
->plt
->sh_entsize
= 4;
991 /* scan for undefined symbols and see if they are in the
992 dynamic symbols. If a symbol STT_FUNC is found, then we
993 add it in the PLT. If a symbol STT_OBJECT is found, we
994 add it in the .bss section with a suitable relocation */
995 sym_end
= (Elf32_Sym
*)(symtab_section
->data
+
996 symtab_section
->data_offset
);
997 if (file_type
== TCC_OUTPUT_EXE
) {
998 for(sym
= (Elf32_Sym
*)symtab_section
->data
+ 1;
1001 if (sym
->st_shndx
== SHN_UNDEF
) {
1002 name
= symtab_section
->link
->data
+ sym
->st_name
;
1003 sym_index
= find_elf_sym(s1
->dynsymtab_section
, name
);
1005 esym
= &((Elf32_Sym
*)s1
->dynsymtab_section
->data
)[sym_index
];
1006 type
= ELF32_ST_TYPE(esym
->st_info
);
1007 if (type
== STT_FUNC
) {
1008 put_got_entry(s1
, R_386_JMP_SLOT
, esym
->st_size
,
1010 sym
- (Elf32_Sym
*)symtab_section
->data
);
1011 } else if (type
== STT_OBJECT
) {
1012 unsigned long offset
;
1013 offset
= bss_section
->data_offset
;
1014 /* XXX: which alignment ? */
1015 offset
= (offset
+ 16 - 1) & -16;
1016 index
= put_elf_sym(s1
->dynsym
, offset
, esym
->st_size
,
1018 bss_section
->sh_num
, name
);
1019 put_elf_reloc(s1
->dynsym
, bss_section
,
1020 offset
, R_386_COPY
, index
);
1021 offset
+= esym
->st_size
;
1022 bss_section
->data_offset
= offset
;
1025 /* STB_WEAK undefined symbols are accepted */
1026 /* XXX: _fp_hw seems to be part of the ABI, so we ignore
1028 if (ELF32_ST_BIND(sym
->st_info
) == STB_WEAK
||
1029 !strcmp(name
, "_fp_hw")) {
1031 error_noabort("undefined symbol '%s'", name
);
1034 } else if (s1
->rdynamic
&&
1035 ELF32_ST_BIND(sym
->st_info
) != STB_LOCAL
) {
1036 /* if -rdynamic option, then export all non
1038 name
= symtab_section
->link
->data
+ sym
->st_name
;
1039 put_elf_sym(s1
->dynsym
, sym
->st_value
, sym
->st_size
,
1041 sym
->st_shndx
, name
);
1048 /* now look at unresolved dynamic symbols and export
1049 corresponding symbol */
1050 sym_end
= (Elf32_Sym
*)(s1
->dynsymtab_section
->data
+
1051 s1
->dynsymtab_section
->data_offset
);
1052 for(esym
= (Elf32_Sym
*)s1
->dynsymtab_section
->data
+ 1;
1055 if (esym
->st_shndx
== SHN_UNDEF
) {
1056 name
= s1
->dynsymtab_section
->link
->data
+ esym
->st_name
;
1057 sym_index
= find_elf_sym(symtab_section
, name
);
1059 /* XXX: avoid adding a symbol if already
1060 present because of -rdynamic ? */
1061 sym
= &((Elf32_Sym
*)symtab_section
->data
)[sym_index
];
1062 put_elf_sym(s1
->dynsym
, sym
->st_value
, sym
->st_size
,
1064 sym
->st_shndx
, name
);
1066 if (ELF32_ST_BIND(esym
->st_info
) == STB_WEAK
) {
1067 /* weak symbols can stay undefined */
1069 warning("undefined dynamic symbol '%s'", name
);
1076 /* shared library case : we simply export all the global symbols */
1077 nb_syms
= symtab_section
->data_offset
/ sizeof(Elf32_Sym
);
1078 s1
->symtab_to_dynsym
= tcc_mallocz(sizeof(int) * nb_syms
);
1079 for(sym
= (Elf32_Sym
*)symtab_section
->data
+ 1;
1082 if (ELF32_ST_BIND(sym
->st_info
) != STB_LOCAL
) {
1083 name
= symtab_section
->link
->data
+ sym
->st_name
;
1084 index
= put_elf_sym(s1
->dynsym
, sym
->st_value
, sym
->st_size
,
1086 sym
->st_shndx
, name
);
1087 s1
->symtab_to_dynsym
[sym
-
1088 (Elf32_Sym
*)symtab_section
->data
] =
1094 build_got_entries(s1
);
1096 /* add a list of needed dlls */
1097 for(i
= 0; i
< s1
->nb_loaded_dlls
; i
++) {
1098 DLLReference
*dllref
= s1
->loaded_dlls
[i
];
1099 if (dllref
->level
== 0)
1100 put_dt(dynamic
, DT_NEEDED
, put_elf_str(dynstr
, dllref
->name
));
1102 /* XXX: currently, since we do not handle PIC code, we
1103 must relocate the readonly segments */
1104 if (file_type
== TCC_OUTPUT_DLL
)
1105 put_dt(dynamic
, DT_TEXTREL
, 0);
1107 /* add necessary space for other entries */
1108 saved_dynamic_data_offset
= dynamic
->data_offset
;
1109 dynamic
->data_offset
+= 8 * 9;
1111 /* still need to build got entries in case of static link */
1112 build_got_entries(s1
);
1116 memset(&ehdr
, 0, sizeof(ehdr
));
1118 /* we add a section for symbols */
1119 strsec
= new_section(s1
, ".shstrtab", SHT_STRTAB
, 0);
1120 put_elf_str(strsec
, "");
1122 /* compute number of sections */
1123 shnum
= s1
->nb_sections
;
1125 /* this array is used to reorder sections in the output file */
1126 section_order
= tcc_malloc(sizeof(int) * shnum
);
1127 section_order
[0] = 0;
1130 /* compute number of program headers */
1133 case TCC_OUTPUT_OBJ
:
1136 case TCC_OUTPUT_EXE
:
1137 if (!s1
->static_link
)
1142 case TCC_OUTPUT_DLL
:
1147 /* allocate strings for section names and decide if an unallocated
1148 section should be output */
1149 /* NOTE: the strsec section comes last, so its size is also
1151 for(i
= 1; i
< s1
->nb_sections
; i
++) {
1152 s
= s1
->sections
[i
];
1153 s
->sh_name
= put_elf_str(strsec
, s
->name
);
1154 /* when generating a DLL, we include relocations but we may
1156 if (file_type
== TCC_OUTPUT_DLL
&&
1157 s
->sh_type
== SHT_REL
&&
1158 !(s
->sh_flags
& SHF_ALLOC
)) {
1159 prepare_dynamic_rel(s1
, s
);
1160 } else if (do_debug
||
1161 file_type
== TCC_OUTPUT_OBJ
||
1162 (s
->sh_flags
& SHF_ALLOC
) ||
1163 i
== (s1
->nb_sections
- 1)) {
1164 /* we output all sections if debug or object file */
1165 s
->sh_size
= s
->data_offset
;
1169 /* allocate program segment headers */
1170 phdr
= tcc_mallocz(phnum
* sizeof(Elf32_Phdr
));
1172 file_offset
= sizeof(Elf32_Ehdr
) + phnum
* sizeof(Elf32_Phdr
);
1174 /* compute section to program header mapping */
1175 if (file_type
== TCC_OUTPUT_DLL
)
1178 addr
= ELF_START_ADDR
;
1180 /* dynamic relocation table information, for .dynamic section */
1184 /* compute address after headers */
1185 addr
+= (file_offset
& (ELF_PAGE_SIZE
- 1));
1187 /* leave one program header for the program interpreter */
1192 for(j
= 0; j
< 2; j
++) {
1193 ph
->p_type
= PT_LOAD
;
1195 ph
->p_flags
= PF_R
| PF_X
;
1197 ph
->p_flags
= PF_R
| PF_W
;
1198 ph
->p_align
= ELF_PAGE_SIZE
;
1200 /* we do the following ordering: interp, symbol tables,
1201 relocations, progbits, nobits */
1202 /* XXX: do faster and simpler sorting */
1203 for(k
= 0; k
< 5; k
++) {
1204 for(i
= 1; i
< s1
->nb_sections
; i
++) {
1205 s
= s1
->sections
[i
];
1206 /* compute if section should be included */
1208 if ((s
->sh_flags
& (SHF_ALLOC
| SHF_WRITE
)) !=
1212 if ((s
->sh_flags
& (SHF_ALLOC
| SHF_WRITE
)) !=
1213 (SHF_ALLOC
| SHF_WRITE
))
1219 } else if (s
->sh_type
== SHT_DYNSYM
||
1220 s
->sh_type
== SHT_STRTAB
||
1221 s
->sh_type
== SHT_HASH
) {
1224 } else if (s
->sh_type
== SHT_REL
) {
1227 } else if (s
->sh_type
== SHT_NOBITS
) {
1234 section_order
[sh_order_index
++] = i
;
1236 /* section matches: we align it and add its size */
1238 file_offset
= (file_offset
+ s
->sh_addralign
- 1) &
1239 ~(s
->sh_addralign
- 1);
1240 s
->sh_offset
= file_offset
;
1241 addr
+= file_offset
- tmp
;
1244 /* update program header infos */
1245 if (ph
->p_offset
== 0) {
1246 ph
->p_offset
= file_offset
;
1248 ph
->p_paddr
= ph
->p_vaddr
;
1250 /* update dynamic relocation infos */
1251 if (s
->sh_type
== SHT_REL
) {
1254 rel_size
+= s
->sh_size
;
1257 if (s
->sh_type
!= SHT_NOBITS
)
1258 file_offset
+= s
->sh_size
;
1261 ph
->p_filesz
= file_offset
- ph
->p_offset
;
1262 ph
->p_memsz
= addr
- ph
->p_vaddr
;
1264 /* if in the middle of a page, we duplicate the page in
1265 memory so that one copy is RX and the other is RW */
1266 if ((addr
& (ELF_PAGE_SIZE
- 1)) != 0)
1267 addr
+= ELF_PAGE_SIZE
;
1270 /* if interpreter, then add corresponing program header */
1274 ph
->p_type
= PT_INTERP
;
1275 ph
->p_offset
= interp
->sh_offset
;
1276 ph
->p_vaddr
= interp
->sh_addr
;
1277 ph
->p_paddr
= ph
->p_vaddr
;
1278 ph
->p_filesz
= interp
->sh_size
;
1279 ph
->p_memsz
= interp
->sh_size
;
1281 ph
->p_align
= interp
->sh_addralign
;
1284 /* if dynamic section, then add corresponing program header */
1288 ph
= &phdr
[phnum
- 1];
1290 ph
->p_type
= PT_DYNAMIC
;
1291 ph
->p_offset
= dynamic
->sh_offset
;
1292 ph
->p_vaddr
= dynamic
->sh_addr
;
1293 ph
->p_paddr
= ph
->p_vaddr
;
1294 ph
->p_filesz
= dynamic
->sh_size
;
1295 ph
->p_memsz
= dynamic
->sh_size
;
1296 ph
->p_flags
= PF_R
| PF_W
;
1297 ph
->p_align
= dynamic
->sh_addralign
;
1299 /* put GOT dynamic section address */
1300 put32(s1
->got
->data
, dynamic
->sh_addr
);
1302 /* relocate the PLT */
1303 if (file_type
== TCC_OUTPUT_EXE
) {
1307 p_end
= p
+ s1
->plt
->data_offset
;
1309 put32(p
+ 2, get32(p
+ 2) + s1
->got
->sh_addr
);
1310 put32(p
+ 8, get32(p
+ 8) + s1
->got
->sh_addr
);
1313 put32(p
+ 2, get32(p
+ 2) + s1
->got
->sh_addr
);
1319 /* relocate symbols in .dynsym */
1320 sym_end
= (Elf32_Sym
*)(s1
->dynsym
->data
+ s1
->dynsym
->data_offset
);
1321 for(sym
= (Elf32_Sym
*)s1
->dynsym
->data
+ 1;
1324 if (sym
->st_shndx
== SHN_UNDEF
) {
1325 /* relocate to the PLT if the symbol corresponds
1328 sym
->st_value
+= s1
->plt
->sh_addr
;
1329 } else if (sym
->st_shndx
< SHN_LORESERVE
) {
1330 /* do symbol relocation */
1331 sym
->st_value
+= s1
->sections
[sym
->st_shndx
]->sh_addr
;
1335 /* put dynamic section entries */
1336 dynamic
->data_offset
= saved_dynamic_data_offset
;
1337 put_dt(dynamic
, DT_HASH
, s1
->dynsym
->hash
->sh_addr
);
1338 put_dt(dynamic
, DT_STRTAB
, dynstr
->sh_addr
);
1339 put_dt(dynamic
, DT_SYMTAB
, s1
->dynsym
->sh_addr
);
1340 put_dt(dynamic
, DT_STRSZ
, dynstr
->data_offset
);
1341 put_dt(dynamic
, DT_SYMENT
, sizeof(Elf32_Sym
));
1342 put_dt(dynamic
, DT_REL
, rel_addr
);
1343 put_dt(dynamic
, DT_RELSZ
, rel_size
);
1344 put_dt(dynamic
, DT_RELENT
, sizeof(Elf32_Rel
));
1345 put_dt(dynamic
, DT_NULL
, 0);
1348 ehdr
.e_phentsize
= sizeof(Elf32_Phdr
);
1349 ehdr
.e_phnum
= phnum
;
1350 ehdr
.e_phoff
= sizeof(Elf32_Ehdr
);
1353 /* all other sections come after */
1354 for(i
= 1; i
< s1
->nb_sections
; i
++) {
1355 s
= s1
->sections
[i
];
1356 if (phnum
> 0 && (s
->sh_flags
& SHF_ALLOC
))
1358 section_order
[sh_order_index
++] = i
;
1360 file_offset
= (file_offset
+ s
->sh_addralign
- 1) &
1361 ~(s
->sh_addralign
- 1);
1362 s
->sh_offset
= file_offset
;
1363 if (s
->sh_type
!= SHT_NOBITS
)
1364 file_offset
+= s
->sh_size
;
1367 /* if building executable or DLL, then relocate each section
1368 except the GOT which is already relocated */
1369 if (file_type
!= TCC_OUTPUT_OBJ
) {
1370 relocate_syms(s1
, 0);
1372 if (s1
->nb_errors
!= 0) {
1378 /* relocate sections */
1379 /* XXX: ignore sections with allocated relocations ? */
1380 for(i
= 1; i
< s1
->nb_sections
; i
++) {
1381 s
= s1
->sections
[i
];
1382 if (s
->reloc
&& s
!= s1
->got
)
1383 relocate_section(s1
, s
);
1386 /* relocate relocation entries if the relocation tables are
1387 allocated in the executable */
1388 for(i
= 1; i
< s1
->nb_sections
; i
++) {
1389 s
= s1
->sections
[i
];
1390 if ((s
->sh_flags
& SHF_ALLOC
) &&
1391 s
->sh_type
== SHT_REL
) {
1392 relocate_rel(s1
, s
);
1396 /* get entry point address */
1397 if (file_type
== TCC_OUTPUT_EXE
)
1398 ehdr
.e_entry
= (unsigned long)tcc_get_symbol_err(s1
, "_start");
1400 ehdr
.e_entry
= text_section
->sh_addr
; /* XXX: is it correct ? */
1403 sort_syms(s1
, symtab_section
);
1406 file_offset
= (file_offset
+ 3) & -4;
1409 ehdr
.e_ident
[0] = ELFMAG0
;
1410 ehdr
.e_ident
[1] = ELFMAG1
;
1411 ehdr
.e_ident
[2] = ELFMAG2
;
1412 ehdr
.e_ident
[3] = ELFMAG3
;
1413 ehdr
.e_ident
[4] = ELFCLASS32
;
1414 ehdr
.e_ident
[5] = ELFDATA2LSB
;
1415 ehdr
.e_ident
[6] = EV_CURRENT
;
1417 ehdr
.e_ident
[EI_OSABI
] = ELFOSABI_FREEBSD
;
1421 case TCC_OUTPUT_EXE
:
1422 ehdr
.e_type
= ET_EXEC
;
1424 case TCC_OUTPUT_DLL
:
1425 ehdr
.e_type
= ET_DYN
;
1427 case TCC_OUTPUT_OBJ
:
1428 ehdr
.e_type
= ET_REL
;
1431 ehdr
.e_machine
= EM_386
;
1432 ehdr
.e_version
= EV_CURRENT
;
1433 ehdr
.e_shoff
= file_offset
;
1434 ehdr
.e_ehsize
= sizeof(Elf32_Ehdr
);
1435 ehdr
.e_shentsize
= sizeof(Elf32_Shdr
);
1436 ehdr
.e_shnum
= shnum
;
1437 ehdr
.e_shstrndx
= shnum
- 1;
1439 /* write elf file */
1440 if (file_type
== TCC_OUTPUT_OBJ
)
1444 fd
= open(filename
, O_WRONLY
| O_CREAT
| O_TRUNC
, mode
);
1446 error_noabort("could not write '%s'", filename
);
1449 f
= fdopen(fd
, "w");
1450 fwrite(&ehdr
, 1, sizeof(Elf32_Ehdr
), f
);
1451 fwrite(phdr
, 1, phnum
* sizeof(Elf32_Phdr
), f
);
1452 offset
= sizeof(Elf32_Ehdr
) + phnum
* sizeof(Elf32_Phdr
);
1453 for(i
=1;i
<s1
->nb_sections
;i
++) {
1454 s
= s1
->sections
[section_order
[i
]];
1455 if (s
->sh_type
!= SHT_NOBITS
) {
1456 while (offset
< s
->sh_offset
) {
1461 fwrite(s
->data
, 1, size
, f
);
1465 while (offset
< ehdr
.e_shoff
) {
1470 /* output section headers */
1471 for(i
=0;i
<s1
->nb_sections
;i
++) {
1473 memset(sh
, 0, sizeof(Elf32_Shdr
));
1474 s
= s1
->sections
[i
];
1476 sh
->sh_name
= s
->sh_name
;
1477 sh
->sh_type
= s
->sh_type
;
1478 sh
->sh_flags
= s
->sh_flags
;
1479 sh
->sh_entsize
= s
->sh_entsize
;
1480 sh
->sh_info
= s
->sh_info
;
1482 sh
->sh_link
= s
->link
->sh_num
;
1483 sh
->sh_addralign
= s
->sh_addralign
;
1484 sh
->sh_addr
= s
->sh_addr
;
1485 sh
->sh_offset
= s
->sh_offset
;
1486 sh
->sh_size
= s
->sh_size
;
1488 fwrite(sh
, 1, sizeof(Elf32_Shdr
), f
);
1494 tcc_free(s1
->symtab_to_dynsym
);
1495 tcc_free(section_order
);
1497 tcc_free(s1
->got_offsets
);
1501 static void *load_data(int fd
, unsigned long file_offset
, unsigned long size
)
1505 data
= tcc_malloc(size
);
1506 lseek(fd
, file_offset
, SEEK_SET
);
1507 read(fd
, data
, size
);
1511 typedef struct SectionMergeInfo
{
1512 Section
*s
; /* corresponding existing section */
1513 unsigned long offset
; /* offset of the new section in the existing section */
1514 uint8_t new_section
; /* true if section 's' was added */
1515 uint8_t link_once
; /* true if link once section */
1518 /* load an object file and merge it with current files */
1519 /* XXX: handle correctly stab (debug) info */
1520 static int tcc_load_object_file(TCCState
*s1
,
1521 int fd
, unsigned long file_offset
)
1524 Elf32_Shdr
*shdr
, *sh
;
1525 int size
, i
, j
, offset
, offseti
, nb_syms
, sym_index
, ret
;
1526 unsigned char *strsec
, *strtab
;
1527 int *old_to_new_syms
;
1528 char *sh_name
, *name
;
1529 SectionMergeInfo
*sm_table
, *sm
;
1530 Elf32_Sym
*sym
, *symtab
;
1531 Elf32_Rel
*rel
, *rel_end
;
1534 if (read(fd
, &ehdr
, sizeof(ehdr
)) != sizeof(ehdr
))
1536 if (ehdr
.e_ident
[0] != ELFMAG0
||
1537 ehdr
.e_ident
[1] != ELFMAG1
||
1538 ehdr
.e_ident
[2] != ELFMAG2
||
1539 ehdr
.e_ident
[3] != ELFMAG3
)
1541 /* test if object file */
1542 if (ehdr
.e_type
!= ET_REL
)
1544 /* test CPU specific stuff */
1545 if (ehdr
.e_ident
[5] != ELFDATA2LSB
||
1546 ehdr
.e_machine
!= EM_386
) {
1548 error_noabort("invalid object file");
1552 shdr
= load_data(fd
, file_offset
+ ehdr
.e_shoff
,
1553 sizeof(Elf32_Shdr
) * ehdr
.e_shnum
);
1554 sm_table
= tcc_mallocz(sizeof(SectionMergeInfo
) * ehdr
.e_shnum
);
1556 /* load section names */
1557 sh
= &shdr
[ehdr
.e_shstrndx
];
1558 strsec
= load_data(fd
, file_offset
+ sh
->sh_offset
, sh
->sh_size
);
1560 /* load symtab and strtab */
1561 old_to_new_syms
= NULL
;
1565 for(i
= 1; i
< ehdr
.e_shnum
; i
++) {
1567 if (sh
->sh_type
== SHT_SYMTAB
) {
1569 error_noabort("object must contain only one symtab");
1574 nb_syms
= sh
->sh_size
/ sizeof(Elf32_Sym
);
1575 symtab
= load_data(fd
, file_offset
+ sh
->sh_offset
, sh
->sh_size
);
1576 sm_table
[i
].s
= symtab_section
;
1578 /* now load strtab */
1579 sh
= &shdr
[sh
->sh_link
];
1580 strtab
= load_data(fd
, file_offset
+ sh
->sh_offset
, sh
->sh_size
);
1584 /* now examine each section and try to merge its content with the
1586 for(i
= 1; i
< ehdr
.e_shnum
; i
++) {
1587 /* no need to examine section name strtab */
1588 if (i
== ehdr
.e_shstrndx
)
1591 sh_name
= strsec
+ sh
->sh_name
;
1592 /* ignore sections types we do not handle */
1593 if (sh
->sh_type
!= SHT_PROGBITS
&&
1594 sh
->sh_type
!= SHT_REL
&&
1595 sh
->sh_type
!= SHT_NOBITS
)
1597 if (sh
->sh_addralign
< 1)
1598 sh
->sh_addralign
= 1;
1599 /* find corresponding section, if any */
1600 for(j
= 1; j
< s1
->nb_sections
;j
++) {
1601 s
= s1
->sections
[j
];
1602 if (!strcmp(s
->name
, sh_name
)) {
1603 if (!strncmp(sh_name
, ".gnu.linkonce",
1604 sizeof(".gnu.linkonce") - 1)) {
1605 /* if a 'linkonce' section is already present, we
1606 do not add it again. It is a little tricky as
1607 symbols can still be defined in
1609 sm_table
[i
].link_once
= 1;
1616 /* not found: create new section */
1617 s
= new_section(s1
, sh_name
, sh
->sh_type
, sh
->sh_flags
);
1618 /* take as much info as possible from the section. sh_link and
1619 sh_info will be updated later */
1620 s
->sh_addralign
= sh
->sh_addralign
;
1621 s
->sh_entsize
= sh
->sh_entsize
;
1622 sm_table
[i
].new_section
= 1;
1624 if (sh
->sh_type
!= s
->sh_type
) {
1625 error_noabort("invalid section type");
1629 /* align start of section */
1630 offset
= s
->data_offset
;
1631 size
= sh
->sh_addralign
- 1;
1632 offset
= (offset
+ size
) & ~size
;
1633 if (sh
->sh_addralign
> s
->sh_addralign
)
1634 s
->sh_addralign
= sh
->sh_addralign
;
1635 s
->data_offset
= offset
;
1636 sm_table
[i
].offset
= offset
;
1638 /* concatenate sections */
1640 if (sh
->sh_type
!= SHT_NOBITS
) {
1642 lseek(fd
, file_offset
+ sh
->sh_offset
, SEEK_SET
);
1643 ptr
= section_ptr_add(s
, size
);
1644 read(fd
, ptr
, size
);
1646 s
->data_offset
+= size
;
1651 /* second short pass to update sh_link and sh_info fields of new
1654 for(i
= 1; i
< ehdr
.e_shnum
; i
++) {
1656 if (!s
|| !sm_table
[i
].new_section
)
1659 if (sh
->sh_link
> 0)
1660 s
->link
= sm_table
[sh
->sh_link
].s
;
1661 if (sh
->sh_type
== SHT_REL
) {
1662 s
->sh_info
= sm_table
[sh
->sh_info
].s
->sh_num
;
1663 /* update backward link */
1664 s1
->sections
[s
->sh_info
]->reloc
= s
;
1668 /* resolve symbols */
1669 old_to_new_syms
= tcc_mallocz(nb_syms
* sizeof(int));
1672 for(i
= 1; i
< nb_syms
; i
++, sym
++) {
1673 if (sym
->st_shndx
!= SHN_UNDEF
&&
1674 sym
->st_shndx
< SHN_LORESERVE
) {
1675 sm
= &sm_table
[sym
->st_shndx
];
1676 if (sm
->link_once
) {
1677 /* if a symbol is in a link once section, we use the
1678 already defined symbol. It is very important to get
1679 correct relocations */
1680 if (ELF32_ST_BIND(sym
->st_info
) != STB_LOCAL
) {
1681 name
= strtab
+ sym
->st_name
;
1682 sym_index
= find_elf_sym(symtab_section
, name
);
1684 old_to_new_syms
[i
] = sym_index
;
1688 /* if no corresponding section added, no need to add symbol */
1691 /* convert section number */
1692 sym
->st_shndx
= sm
->s
->sh_num
;
1694 sym
->st_value
+= sm
->offset
;
1697 name
= strtab
+ sym
->st_name
;
1698 sym_index
= add_elf_sym(symtab_section
, sym
->st_value
, sym
->st_size
,
1699 sym
->st_info
, sym
->st_shndx
, name
);
1700 old_to_new_syms
[i
] = sym_index
;
1703 /* third pass to patch relocation entries */
1704 for(i
= 1; i
< ehdr
.e_shnum
; i
++) {
1709 offset
= sm_table
[i
].offset
;
1710 switch(s
->sh_type
) {
1712 /* take relocation offset information */
1713 offseti
= sm_table
[sh
->sh_info
].offset
;
1714 rel_end
= (Elf32_Rel
*)(s
->data
+ s
->data_offset
);
1715 for(rel
= (Elf32_Rel
*)(s
->data
+ offset
);
1720 /* convert symbol index */
1721 type
= ELF32_R_TYPE(rel
->r_info
);
1722 sym_index
= ELF32_R_SYM(rel
->r_info
);
1723 /* NOTE: only one symtab assumed */
1724 if (sym_index
>= nb_syms
)
1726 sym_index
= old_to_new_syms
[sym_index
];
1729 error_noabort("Invalid relocation entry");
1732 rel
->r_info
= ELF32_R_INFO(sym_index
, type
);
1733 /* offset the relocation offset */
1734 rel
->r_offset
+= offseti
;
1746 tcc_free(old_to_new_syms
);
1753 #define ARMAG "!<arch>\012" /* For COFF and a.out archives */
1755 typedef struct ArchiveHeader
{
1756 char ar_name
[16]; /* name of this member */
1757 char ar_date
[12]; /* file mtime */
1758 char ar_uid
[6]; /* owner uid; printed as decimal */
1759 char ar_gid
[6]; /* owner gid; printed as decimal */
1760 char ar_mode
[8]; /* file mode, printed as octal */
1761 char ar_size
[10]; /* file size, printed as decimal */
1762 char ar_fmag
[2]; /* should contain ARFMAG */
1765 static int get_be32(const uint8_t *b
)
1767 return b
[3] | (b
[2] << 8) | (b
[1] << 16) | (b
[0] << 24);
1770 /* load only the objects which resolve undefined symbols */
1771 static int tcc_load_alacarte(TCCState
*s1
, int fd
, int size
)
1773 int i
, bound
, nsyms
, sym_index
, off
, ret
;
1775 const char *ar_names
, *p
;
1776 const uint8_t *ar_index
;
1779 data
= tcc_malloc(size
);
1780 if (read(fd
, data
, size
) != size
)
1782 nsyms
= get_be32(data
);
1783 ar_index
= data
+ 4;
1784 ar_names
= ar_index
+ nsyms
* 4;
1788 for(p
= ar_names
, i
= 0; i
< nsyms
; i
++, p
+= strlen(p
)+1) {
1789 sym_index
= find_elf_sym(symtab_section
, p
);
1791 sym
= &((Elf32_Sym
*)symtab_section
->data
)[sym_index
];
1792 if(sym
->st_shndx
== SHN_UNDEF
) {
1793 off
= get_be32(ar_index
+ i
* 4) + sizeof(ArchiveHeader
);
1795 printf("%5d\t%s\t%08x\n", i
, p
, sym
->st_shndx
);
1798 lseek(fd
, off
, SEEK_SET
);
1799 if(tcc_load_object_file(s1
, fd
, off
) < 0) {
1814 /* load a '.a' file */
1815 static int tcc_load_archive(TCCState
*s1
, int fd
)
1822 unsigned long file_offset
;
1824 /* skip magic which was already checked */
1825 read(fd
, magic
, sizeof(magic
));
1828 len
= read(fd
, &hdr
, sizeof(hdr
));
1831 if (len
!= sizeof(hdr
)) {
1832 error_noabort("invalid archive");
1835 memcpy(ar_size
, hdr
.ar_size
, sizeof(hdr
.ar_size
));
1836 ar_size
[sizeof(hdr
.ar_size
)] = '\0';
1837 size
= strtol(ar_size
, NULL
, 0);
1838 memcpy(ar_name
, hdr
.ar_name
, sizeof(hdr
.ar_name
));
1839 for(i
= sizeof(hdr
.ar_name
) - 1; i
>= 0; i
--) {
1840 if (ar_name
[i
] != ' ')
1843 ar_name
[i
+ 1] = '\0';
1844 // printf("name='%s' size=%d %s\n", ar_name, size, ar_size);
1845 file_offset
= lseek(fd
, 0, SEEK_CUR
);
1847 size
= (size
+ 1) & ~1;
1848 if (!strcmp(ar_name
, "/")) {
1849 /* coff symbol table : we handle it */
1850 if(s1
->alacarte_link
)
1851 return tcc_load_alacarte(s1
, fd
, size
);
1852 } else if (!strcmp(ar_name
, "//") ||
1853 !strcmp(ar_name
, "__.SYMDEF") ||
1854 !strcmp(ar_name
, "__.SYMDEF/") ||
1855 !strcmp(ar_name
, "ARFILENAMES/")) {
1856 /* skip symbol table or archive names */
1858 if (tcc_load_object_file(s1
, fd
, file_offset
) < 0)
1861 lseek(fd
, file_offset
+ size
, SEEK_SET
);
1866 /* load a DLL and all referenced DLLs. 'level = 0' means that the DLL
1867 is referenced by the user (so it should be added as DT_NEEDED in
1868 the generated ELF file) */
1869 static int tcc_load_dll(TCCState
*s1
, int fd
, const char *filename
, int level
)
1872 Elf32_Shdr
*shdr
, *sh
, *sh1
;
1873 int i
, nb_syms
, nb_dts
, sym_bind
, ret
;
1874 Elf32_Sym
*sym
, *dynsym
;
1875 Elf32_Dyn
*dt
, *dynamic
;
1876 unsigned char *dynstr
;
1877 const char *name
, *soname
, *p
;
1878 DLLReference
*dllref
;
1880 read(fd
, &ehdr
, sizeof(ehdr
));
1882 /* test CPU specific stuff */
1883 if (ehdr
.e_ident
[5] != ELFDATA2LSB
||
1884 ehdr
.e_machine
!= EM_386
) {
1885 error_noabort("bad architecture");
1890 shdr
= load_data(fd
, ehdr
.e_shoff
, sizeof(Elf32_Shdr
) * ehdr
.e_shnum
);
1892 /* load dynamic section and dynamic symbols */
1896 dynsym
= NULL
; /* avoid warning */
1897 dynstr
= NULL
; /* avoid warning */
1898 for(i
= 0, sh
= shdr
; i
< ehdr
.e_shnum
; i
++, sh
++) {
1899 switch(sh
->sh_type
) {
1901 nb_dts
= sh
->sh_size
/ sizeof(Elf32_Dyn
);
1902 dynamic
= load_data(fd
, sh
->sh_offset
, sh
->sh_size
);
1905 nb_syms
= sh
->sh_size
/ sizeof(Elf32_Sym
);
1906 dynsym
= load_data(fd
, sh
->sh_offset
, sh
->sh_size
);
1907 sh1
= &shdr
[sh
->sh_link
];
1908 dynstr
= load_data(fd
, sh1
->sh_offset
, sh1
->sh_size
);
1915 /* compute the real library name */
1917 p
= strrchr(soname
, '/');
1921 for(i
= 0, dt
= dynamic
; i
< nb_dts
; i
++, dt
++) {
1922 if (dt
->d_tag
== DT_SONAME
) {
1923 soname
= dynstr
+ dt
->d_un
.d_val
;
1927 /* if the dll is already loaded, do not load it */
1928 for(i
= 0; i
< s1
->nb_loaded_dlls
; i
++) {
1929 dllref
= s1
->loaded_dlls
[i
];
1930 if (!strcmp(soname
, dllref
->name
)) {
1931 /* but update level if needed */
1932 if (level
< dllref
->level
)
1933 dllref
->level
= level
;
1939 // printf("loading dll '%s'\n", soname);
1941 /* add the dll and its level */
1942 dllref
= tcc_malloc(sizeof(DLLReference
) + strlen(soname
));
1943 dllref
->level
= level
;
1944 strcpy(dllref
->name
, soname
);
1945 dynarray_add((void ***)&s1
->loaded_dlls
, &s1
->nb_loaded_dlls
, dllref
);
1947 /* add dynamic symbols in dynsym_section */
1948 for(i
= 1, sym
= dynsym
+ 1; i
< nb_syms
; i
++, sym
++) {
1949 sym_bind
= ELF32_ST_BIND(sym
->st_info
);
1950 if (sym_bind
== STB_LOCAL
)
1952 name
= dynstr
+ sym
->st_name
;
1953 add_elf_sym(s1
->dynsymtab_section
, sym
->st_value
, sym
->st_size
,
1954 sym
->st_info
, sym
->st_shndx
, name
);
1957 /* load all referenced DLLs */
1958 for(i
= 0, dt
= dynamic
; i
< nb_dts
; i
++, dt
++) {
1961 name
= dynstr
+ dt
->d_un
.d_val
;
1962 for(i
= 0; i
< s1
->nb_loaded_dlls
; i
++) {
1963 dllref
= s1
->loaded_dlls
[i
];
1964 if (!strcmp(name
, dllref
->name
))
1965 goto already_loaded
;
1967 if (tcc_add_dll(s1
, name
, AFF_REFERENCED_DLL
) < 0) {
1968 error_noabort("referenced dll '%s' not found", name
);
1985 #define LD_TOK_NAME 256
1986 #define LD_TOK_EOF (-1)
1988 /* return next ld script token */
1989 static int ld_next(TCCState
*s1
, char *name
, int name_size
)
2007 file
->buf_ptr
= parse_comment(file
->buf_ptr
);
2008 ch
= file
->buf_ptr
[0];
2026 if (!((ch
>= 'a' && ch
<= 'z') ||
2027 (ch
>= 'A' && ch
<= 'Z') ||
2028 (ch
>= '0' && ch
<= '9') ||
2029 strchr("/.-_+=$:\\,~", ch
)))
2031 if ((q
- name
) < name_size
- 1) {
2048 printf("tok=%c %d\n", c
, c
);
2049 if (c
== LD_TOK_NAME
)
2050 printf(" name=%s\n", name
);
2055 /* interpret a subset of GNU ldscripts to handle the dummy libc.so
2057 static int tcc_load_ldscript(TCCState
*s1
)
2060 char filename
[1024];
2063 ch
= file
->buf_ptr
[0];
2066 t
= ld_next(s1
, cmd
, sizeof(cmd
));
2067 if (t
== LD_TOK_EOF
)
2069 else if (t
!= LD_TOK_NAME
)
2071 if (!strcmp(cmd
, "INPUT") ||
2072 !strcmp(cmd
, "GROUP")) {
2073 t
= ld_next(s1
, cmd
, sizeof(cmd
));
2076 t
= ld_next(s1
, filename
, sizeof(filename
));
2078 if (t
== LD_TOK_EOF
) {
2079 error_noabort("unexpected end of file");
2081 } else if (t
== ')') {
2083 } else if (t
!= LD_TOK_NAME
) {
2084 error_noabort("filename expected");
2087 tcc_add_file(s1
, filename
);
2088 t
= ld_next(s1
, filename
, sizeof(filename
));
2090 t
= ld_next(s1
, filename
, sizeof(filename
));
2093 } else if (!strcmp(cmd
, "OUTPUT_FORMAT") ||
2094 !strcmp(cmd
, "TARGET")) {
2095 /* ignore some commands */
2096 t
= ld_next(s1
, cmd
, sizeof(cmd
));
2100 t
= ld_next(s1
, filename
, sizeof(filename
));
2101 if (t
== LD_TOK_EOF
) {
2102 error_noabort("unexpected end of file");
2104 } else if (t
== ')') {