diff options
Diffstat (limited to 'gas/config/obj-ecoff.c')
-rw-r--r-- | gas/config/obj-ecoff.c | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/gas/config/obj-ecoff.c b/gas/config/obj-ecoff.c index 30d292f..e4f90c0 100644 --- a/gas/config/obj-ecoff.c +++ b/gas/config/obj-ecoff.c @@ -2108,11 +2108,16 @@ get_tag (tag, sym, basic_type) if (hash_ptr == (shash_t *) NULL) { + char *perm; + + perm = xmalloc (strlen (tag) + 1); + strcpy (perm, tag); hash_ptr = allocate_shash (); - err = hash_insert (tag_hash, tag, (char *) hash_ptr); + err = hash_insert (tag_hash, perm, (char *) hash_ptr); if (*err != '\0') as_fatal ("Inserting \"%s\" into tag hash table: %s", tag, err); + hash_ptr->string = perm; } tag_ptr = allocate_tag (); @@ -3844,19 +3849,28 @@ ecoff_build_symbols (buf, /* The value of a block start symbol is the offset from the start of the procedure. For - other symbols we just use the gas value. */ + other symbols we just use the gas value (but + we must offset it by the vma of the section, + just as BFD does, because BFD will not see + this value). */ if (sym_ptr->ecoff_sym.st == (int) st_Block && sym_ptr->ecoff_sym.sc == (int) sc_Text) { + symbolS *begin_sym; + know (sym_ptr->proc_ptr != (proc_t *) NULL); + begin_sym = sym_ptr->proc_ptr->sym->as_sym; + if (S_GET_SEGMENT (as_sym) + != S_GET_SEGMENT (begin_sym)) + as_warn (".begin/.bend in different segments"); sym_ptr->ecoff_sym.value = - (bfd_asymbol_value (as_sym->bsym) - - bfd_asymbol_value (sym_ptr->proc_ptr->sym - ->as_sym->bsym)); + S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym); } else sym_ptr->ecoff_sym.value = - bfd_asymbol_value (as_sym->bsym); + (S_GET_VALUE (as_sym) + + bfd_get_section_vma (stdoutput, + S_GET_SEGMENT (as_sym))); /* Set st_Proc to st_StaticProc for local functions. */ @@ -4000,19 +4014,26 @@ ecoff_build_symbols (buf, { know (as_sym != (symbolS *) NULL); know (begin_ptr->as_sym != (symbolS *) NULL); + if (S_GET_SEGMENT (as_sym) + != S_GET_SEGMENT (begin_ptr->as_sym)) + as_warn (".begin/.bend in different segments"); sym_ptr->ecoff_sym.value = - (bfd_asymbol_value (as_sym->bsym) - - bfd_asymbol_value (begin_ptr->as_sym->bsym)); + (S_GET_VALUE (as_sym) + - S_GET_VALUE (begin_ptr->as_sym)); } else if (begin_type == st_Block && sym_ptr->ecoff_sym.sc != (int) sc_Info) { + symbolS *begin_sym; + know (as_sym != (symbolS *) NULL); know (sym_ptr->proc_ptr != (proc_t *) NULL); + begin_sym = sym_ptr->proc_ptr->sym->as_sym; + if (S_GET_SEGMENT (as_sym) + != S_GET_SEGMENT (begin_sym)) + as_warn (".begin/.bend in different segments"); sym_ptr->ecoff_sym.value = - (bfd_asymbol_value (as_sym->bsym) - - bfd_asymbol_value (sym_ptr->proc_ptr->sym - ->as_sym->bsym)); + S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym); } } @@ -4143,9 +4164,13 @@ ecoff_build_procs (buf, bufend, offset) proc_end = proc_ptr + proc_cnt; for (; proc_ptr < proc_end; proc_ptr++) { + symbolS *adr_sym; unsigned long adr; - adr = bfd_asymbol_value (proc_ptr->sym->as_sym->bsym); + adr_sym = proc_ptr->sym->as_sym; + adr = (S_GET_VALUE (adr_sym) + + bfd_get_section_vma (stdoutput, + S_GET_SEGMENT (adr_sym))); if (first) { if (first_fil) @@ -4499,7 +4524,7 @@ ecoff_frob_file () cur_file_ptr = sym->ecoff_file; add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym, - bfd_asymbol_value (sym->bsym), indexNil); + S_GET_VALUE (sym), indexNil); } cur_proc_ptr = hold_proc_ptr; cur_file_ptr = hold_file_ptr; |