mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
* xcofflink.c (xcoff_link_input_bfd): Fix scan for C_BINCL/C_EINCL
symbols.
This commit is contained in:
parent
3998d526b9
commit
c3dffbd7cd
@ -1,5 +1,8 @@
|
||||
Fri Mar 22 12:17:00 1996 Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
* xcofflink.c (xcoff_link_input_bfd): Fix scan for C_BINCL/C_EINCL
|
||||
symbols.
|
||||
|
||||
* config.bfd: Add ieee_vec to targ_selvecs for i960 targets and
|
||||
m68k-aout, m68k-coff, and m68k-elf targets.
|
||||
|
||||
|
@ -1672,8 +1672,13 @@ xcoff_link_add_symbols (abfd, info)
|
||||
OK for symbol redefinitions to occur. I can't figure
|
||||
out just what the XCOFF linker is doing, but
|
||||
something like this is required for -bnso to work. */
|
||||
*sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
|
||||
name, true, copy, false);
|
||||
if (! bfd_is_und_section (section))
|
||||
*sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
|
||||
name, true, copy, false);
|
||||
else
|
||||
*sym_hash = ((struct xcoff_link_hash_entry *)
|
||||
bfd_wrapped_link_hash_lookup (abfd, info, name,
|
||||
true, copy, false));
|
||||
if (*sym_hash == NULL)
|
||||
goto error_return;
|
||||
if (((*sym_hash)->root.type == bfd_link_hash_defined
|
||||
@ -1982,7 +1987,7 @@ xcoff_link_add_dynamic_symbols (abfd, info)
|
||||
name = nambuf;
|
||||
}
|
||||
|
||||
/* Normally we could not xcoff_link_hash_lookup in an add
|
||||
/* Normally we could not call xcoff_link_hash_lookup in an add
|
||||
symbols routine, since we might not be using an XCOFF hash
|
||||
table. However, we verified above that we are using an XCOFF
|
||||
hash table. */
|
||||
@ -2214,7 +2219,10 @@ xcoff_mark (info, sec)
|
||||
&& h->root.root.string[0] == '.'
|
||||
&& h->descriptor != NULL
|
||||
&& ((h->descriptor->flags & XCOFF_DEF_DYNAMIC) != 0
|
||||
|| info->shared)))
|
||||
|| info->shared
|
||||
|| ((h->descriptor->flags & XCOFF_IMPORT) != 0
|
||||
&& (h->descriptor->flags
|
||||
& XCOFF_DEF_REGULAR) == 0))))
|
||||
break;
|
||||
/* Fall through. */
|
||||
case R_POS:
|
||||
@ -2488,8 +2496,9 @@ bfd_xcoff_link_count_reloc (output_bfd, info, name)
|
||||
if (! XCOFF_XVECP (output_bfd->xvec))
|
||||
return true;
|
||||
|
||||
h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, false, false,
|
||||
false);
|
||||
h = ((struct xcoff_link_hash_entry *)
|
||||
bfd_wrapped_link_hash_lookup (output_bfd, info, name, false, false,
|
||||
false));
|
||||
if (h == NULL)
|
||||
{
|
||||
(*_bfd_error_handler) ("%s: no such symbol", name);
|
||||
@ -2629,13 +2638,7 @@ bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry,
|
||||
hentry = xcoff_link_hash_lookup (xcoff_hash_table (info), entry,
|
||||
false, false, true);
|
||||
if (hentry != NULL)
|
||||
{
|
||||
hentry->flags |= XCOFF_ENTRY;
|
||||
if (hentry->root.type == bfd_link_hash_defined
|
||||
|| hentry->root.type == bfd_link_hash_defweak)
|
||||
xcoff_data (output_bfd)->entry_section =
|
||||
hentry->root.u.def.section->output_section;
|
||||
}
|
||||
hentry->flags |= XCOFF_ENTRY;
|
||||
|
||||
/* Garbage collect unused sections. */
|
||||
if (info->relocateable
|
||||
@ -2941,16 +2944,18 @@ xcoff_build_ldsyms (h, p)
|
||||
h->flags |= XCOFF_MARK;
|
||||
|
||||
/* If this symbol is called and defined in a dynamic object, or not
|
||||
defined at all when building a shared object, then we need to set
|
||||
up global linkage code for it. (Unless we did garbage collection
|
||||
and we didn't need this symbol.) */
|
||||
defined at all when building a shared object, or imported, then
|
||||
we need to set up global linkage code for it. (Unless we did
|
||||
garbage collection and we didn't need this symbol.) */
|
||||
if ((h->flags & XCOFF_CALLED) != 0
|
||||
&& (h->root.type == bfd_link_hash_undefined
|
||||
|| h->root.type == bfd_link_hash_undefweak)
|
||||
&& h->root.root.string[0] == '.'
|
||||
&& h->descriptor != NULL
|
||||
&& ((h->descriptor->flags & XCOFF_DEF_DYNAMIC) != 0
|
||||
|| ldinfo->info->shared)
|
||||
|| ldinfo->info->shared
|
||||
|| ((h->descriptor->flags & XCOFF_IMPORT) != 0
|
||||
&& (h->descriptor->flags & XCOFF_DEF_REGULAR) == 0))
|
||||
&& (! xcoff_hash_table (ldinfo->info)->gc
|
||||
|| (h->flags & XCOFF_MARK) != 0))
|
||||
{
|
||||
@ -3926,6 +3931,13 @@ xcoff_link_input_bfd (finfo, input_bfd)
|
||||
xcoff_swap_ldsym_out (finfo->output_bfd, ldsym,
|
||||
finfo->ldsym + h->ldindx - 3);
|
||||
h->ldsym = NULL;
|
||||
|
||||
/* Fill in snentry now that we know the target_index. */
|
||||
if ((h->flags & XCOFF_ENTRY) != 0
|
||||
&& (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak))
|
||||
xcoff_data (output_bfd)->snentry =
|
||||
h->root.u.def.section->output_section->target_index;
|
||||
}
|
||||
|
||||
*indexp = -1;
|
||||
@ -3987,8 +3999,8 @@ xcoff_link_input_bfd (finfo, input_bfd)
|
||||
|
||||
finfo->toc_symindx = output_index;
|
||||
xcoff_data (finfo->output_bfd)->toc = tocval;
|
||||
xcoff_data (finfo->output_bfd)->toc_section =
|
||||
(*csectpp)->output_section;
|
||||
xcoff_data (finfo->output_bfd)->sntoc =
|
||||
(*csectpp)->output_section->target_index;
|
||||
require = true;
|
||||
}
|
||||
}
|
||||
@ -4457,6 +4469,7 @@ xcoff_link_input_bfd (finfo, input_bfd)
|
||||
struct internal_syment *iisp, *iispend;
|
||||
long *iindp;
|
||||
bfd_byte *oos;
|
||||
int iiadd;
|
||||
|
||||
/* Update any C_BINCL or C_EINCL symbols
|
||||
that refer to a line number in the
|
||||
@ -4468,8 +4481,9 @@ xcoff_link_input_bfd (finfo, input_bfd)
|
||||
oos = finfo->outsyms;
|
||||
while (iisp < iispend)
|
||||
{
|
||||
if ((iisp->n_sclass == C_BINCL
|
||||
|| iisp->n_sclass == C_EINCL)
|
||||
if (*iindp >= 0
|
||||
&& (iisp->n_sclass == C_BINCL
|
||||
|| iisp->n_sclass == C_EINCL)
|
||||
&& ((bfd_size_type) iisp->n_value
|
||||
>= enclosing->line_filepos + linoff)
|
||||
&& ((bfd_size_type) iisp->n_value
|
||||
@ -4492,9 +4506,11 @@ xcoff_link_input_bfd (finfo, input_bfd)
|
||||
--incls;
|
||||
}
|
||||
|
||||
iisp += iisp->n_numaux + 1;
|
||||
iindp += iisp->n_numaux + 1;
|
||||
oos += (iisp->n_numaux + 1) * osymesz;
|
||||
iiadd = 1 + iisp->n_numaux;
|
||||
if (*iindp >= 0)
|
||||
oos += iiadd * osymesz;
|
||||
iisp += iiadd;
|
||||
iindp += iiadd;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5073,7 +5089,8 @@ xcoff_write_global_symbol (h, p)
|
||||
|
||||
bfd_put_32 (output_bfd, xcoff_data (output_bfd)->toc, p + 4);
|
||||
|
||||
tsec = xcoff_data (output_bfd)->toc_section;
|
||||
tsec = coff_section_from_bfd_index (output_bfd,
|
||||
xcoff_data (output_bfd)->sntoc);
|
||||
|
||||
++irel;
|
||||
irel->r_vaddr = (osec->vma
|
||||
@ -5272,9 +5289,10 @@ xcoff_reloc_link_order (output_bfd, finfo, output_section, link_order)
|
||||
return false;
|
||||
}
|
||||
|
||||
h = xcoff_link_hash_lookup (xcoff_hash_table (finfo->info),
|
||||
link_order->u.reloc.p->u.name,
|
||||
false, false, true);
|
||||
h = ((struct xcoff_link_hash_entry *)
|
||||
bfd_wrapped_link_hash_lookup (output_bfd, finfo->info,
|
||||
link_order->u.reloc.p->u.name,
|
||||
false, false, true));
|
||||
if (h == NULL)
|
||||
{
|
||||
if (! ((*finfo->info->callbacks->unattached_reloc)
|
||||
|
Loading…
Reference in New Issue
Block a user