History

tccelf: allow multiple declaration of bss/common symbols

also in combination with one initialized: For example 1.c int xxx; 2.c int xxx = 2; 3.c int xxx; tcc 1.c 2.c 3.c

grischka committed 10 years ago

Commit e03306d1 parent 332cf531 file · +8 −5Browse files

Unified · Split

tccelf.c+8−5
@@ -236,11 +236,14 @@ ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, · 235 unmodified lines
236 /* keep first-found weak definition, ignore subsequents */236 /* keep first-found weak definition, ignore subsequents */
237 } else if (sym_vis == STV_HIDDEN || sym_vis == STV_INTERNAL) {237 } else if (sym_vis == STV_HIDDEN || sym_vis == STV_INTERNAL) {
238 /* ignore hidden symbols after */238 /* ignore hidden symbols after */
239 } else if (esym->st_shndx == SHN_COMMON239 } else if ((esym->st_shndx == SHN_COMMON
240 && (sh_num < SHN_LORESERVE || sh_num == SHN_COMMON)) {240 || esym->st_shndx == bss_section->sh_num)
241 /* gr: Happens with 'tcc ... -static tcctest.c' on e.g. Ubuntu 6.01241 && (sh_num < SHN_LORESERVE
242 No idea if this is the correct solution ... */242 && sh_num != bss_section->sh_num)) {
243 /* data symbol gets precedence over common/bss */
243 goto do_patch;244 goto do_patch;
245 } else if (sh_num == SHN_COMMON || sh_num == bss_section->sh_num) {
246 /* data symbol keeps precedence over common/bss */
244 } else if (s == tcc_state->dynsymtab_section) {247 } else if (s == tcc_state->dynsymtab_section) {
245 /* we accept that two DLL define the same symbol */248 /* we accept that two DLL define the same symbol */
246 } else {249 } else {
@@ -248,7 +251,7 @@ ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, · 1 unmodified line
248 printf("new_bind=%x new_shndx=%x new_vis=%x old_bind=%x old_shndx=%x old_vis=%x\n",251 printf("new_bind=%x new_shndx=%x new_vis=%x old_bind=%x old_shndx=%x old_vis=%x\n",
249 sym_bind, sh_num, new_vis, esym_bind, esym->st_shndx, esym_vis);252 sym_bind, sh_num, new_vis, esym_bind, esym->st_shndx, esym_vis);
250#endif253#endif
251 tcc_error_noabort("'%s' defined twice... may be -fcommon is needed?", name);254 tcc_error_noabort("'%s' defined twice", name);
252 }255 }
253 } else {256 } else {
254 do_patch:257 do_patch:

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t