dsec->alignment_power = 2;
}
/* Likewise for the .debug section. */
- if (xcoff_hash_table (info)->debug_section == NULL)
+ if (xcoff_hash_table (info)->debug_section == NULL
+ && info->strip != strip_all)
{
asection *dsec;
if (enclosing == NULL)
{
(*_bfd_error_handler)
- ("%s: `%s' has line numbers but no enclosing section",
+ (_("%s: `%s' has line numbers but no enclosing section"),
bfd_get_filename (abfd), name);
bfd_set_error (bfd_error_bad_value);
goto error_return;
if (sym.n_numaux == 0)
{
(*_bfd_error_handler)
- ("%s: class %d symbol `%s' has no aux entries",
+ (_("%s: class %d symbol `%s' has no aux entries"),
bfd_get_filename (abfd), sym.n_sclass, name);
bfd_set_error (bfd_error_bad_value);
goto error_return;
{
default:
(*_bfd_error_handler)
- ("%s: symbol `%s' has unrecognized csect type %d",
+ (_("%s: symbol `%s' has unrecognized csect type %d"),
bfd_get_filename (abfd), name, smtyp);
bfd_set_error (bfd_error_bad_value);
goto error_return;
|| aux.x_csect.x_scnlen.l != 0)
{
(*_bfd_error_handler)
- ("%s: bad XTY_ER symbol `%s': class %d scnum %d scnlen %d",
+ (_("%s: bad XTY_ER symbol `%s': class %d scnum %d scnlen %d"),
bfd_get_filename (abfd), name, sym.n_sclass, sym.n_scnum,
aux.x_csect.x_scnlen.l);
bfd_set_error (bfd_error_bad_value);
|| aux.x_csect.x_scnlen.l != 0)
{
(*_bfd_error_handler)
- ("%s: XMC_TC0 symbol `%s' is class %d scnlen %d",
+ (_("%s: XMC_TC0 symbol `%s' is class %d scnlen %d"),
bfd_get_filename (abfd), name, sym.n_sclass,
aux.x_csect.x_scnlen.l);
bfd_set_error (bfd_error_bad_value);
|| csect_name_by_class[aux.x_csect.x_smclas] == NULL)
{
(*_bfd_error_handler)
- ("%s: symbol `%s' has unrecognized smclas %d",
+ (_("%s: symbol `%s' has unrecognized smclas %d"),
bfd_get_filename (abfd), name, aux.x_csect.x_smclas);
bfd_set_error (bfd_error_bad_value);
goto error_return;
> enclosing->vma + enclosing->_raw_size)))
{
(*_bfd_error_handler)
- ("%s: csect `%s' not in enclosing section",
+ (_("%s: csect `%s' not in enclosing section"),
bfd_get_filename (abfd), name);
bfd_set_error (bfd_error_bad_value);
goto error_return;
if (bad)
{
(*_bfd_error_handler)
- ("%s: misplaced XTY_LD `%s'",
+ (_("%s: misplaced XTY_LD `%s'"),
bfd_get_filename (abfd), name);
bfd_set_error (bfd_error_bad_value);
goto error_return;
case XTY_CM:
/* This is an unitialized csect. We could base the name on
- the storage mapping class, but we don't bother. If this
- csect is externally visible, it is a common symbol. */
+ the storage mapping class, but we don't bother except for
+ an XMC_TD symbol. If this csect is externally visible,
+ it is a common symbol. We put XMC_TD symbols in sections
+ named .tocbss, and rely on the linker script to put that
+ in the TOC area. */
if (csect != NULL)
{
/ symesz);
}
- csect = bfd_make_section_anyway (abfd, ".bss");
+ if (aux.x_csect.x_smclas == XMC_TD)
+ csect = bfd_make_section_anyway (abfd, ".tocbss");
+ else
+ csect = bfd_make_section_anyway (abfd, ".bss");
if (csect == NULL)
goto error_return;
csect->vma = sym.n_value;
file actually defines an initialized array, so we have to
actually permit that to work.
+ Just to make matters even more confusing, the AIX linker
+ appears to permit multiple symbol definitions whenever
+ the second definition is in an archive rather than an
+ object file. This may be a consequence of the manner in
+ which it handles archives: I think it may load the entire
+ archive in as separate csects, and then let garbage
+ collection discard symbols.
+
We also have to handle the case of statically linking a
shared object, which will cause symbol redefinitions,
although this is an easier case to detect. */
(*sym_hash)->root.u.undef.abfd =
(*sym_hash)->root.u.def.section->owner;
}
+ else if (abfd->my_archive != NULL)
+ {
+ /* This is a redefinition in an object contained
+ in an archive. Just ignore it. See the
+ comment above. */
+ section = bfd_und_section_ptr;
+ value = 0;
+ }
else if ((*sym_hash)->root.next != NULL
|| info->hash->undefs_tail == &(*sym_hash)->root)
{
if (*rel_csect == NULL)
{
(*_bfd_error_handler)
- ("%s: reloc %s:%d not in csect",
+ (_("%s: reloc %s:%d not in csect"),
bfd_get_filename (abfd), o->name, i);
bfd_set_error (bfd_error_bad_value);
goto error_return;
if (info->hash->creator != abfd->xvec)
{
(*_bfd_error_handler)
- ("%s: XCOFF shared object when not producing XCOFF output",
+ (_("%s: XCOFF shared object when not producing XCOFF output"),
bfd_get_filename (abfd));
bfd_set_error (bfd_error_invalid_operation);
return false;
if (lsec == NULL)
{
(*_bfd_error_handler)
- ("%s: dynamic object with no .loader section",
+ (_("%s: dynamic object with no .loader section"),
bfd_get_filename (abfd));
bfd_set_error (bfd_error_no_symbols);
return false;
asection *hsec;
hsec = h->root.u.def.section;
- if ((hsec->flags & SEC_MARK) == 0)
+ if (! bfd_is_abs_section (hsec)
+ && (hsec->flags & SEC_MARK) == 0)
{
if (! xcoff_mark (info, hsec))
return false;
struct bfd_link_info *info;
asection *sec;
{
- if ((sec->flags & SEC_MARK) != 0)
+ if (bfd_is_abs_section (sec)
+ || (sec->flags & SEC_MARK) != 0)
return true;
sec->flags |= SEC_MARK;
if (! XCOFF_XVECP (output_bfd->xvec))
return true;
+ /* A symbol name which starts with a period is the code for a
+ function. If the symbol is undefined, then add an undefined
+ symbol for the function descriptor, and import that instead. */
+ if (h->root.root.string[0] == '.'
+ && h->root.type == bfd_link_hash_undefined
+ && val == (bfd_vma) -1)
+ {
+ struct xcoff_link_hash_entry *hds;
+
+ hds = h->descriptor;
+ if (hds == NULL)
+ {
+ hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
+ h->root.root.string + 1,
+ true, false, true);
+ if (hds == NULL)
+ return false;
+ if (hds->root.type == bfd_link_hash_new)
+ {
+ hds->root.type = bfd_link_hash_undefined;
+ hds->root.u.undef.abfd = h->root.u.undef.abfd;
+ }
+ hds->flags |= XCOFF_DESCRIPTOR;
+ BFD_ASSERT ((hds->flags & XCOFF_CALLED) == 0
+ && (h->flags & XCOFF_DESCRIPTOR) == 0);
+ hds->descriptor = h;
+ h->descriptor = hds;
+ }
+
+ /* Now, if the descriptor is undefined, import the descriptor
+ rather than the symbol we were told to import. FIXME: Is
+ this correct in all cases? */
+ if (hds->root.type == bfd_link_hash_undefined)
+ h = hds;
+ }
+
h->flags |= XCOFF_IMPORT;
if (val != (bfd_vma) -1)
false));
if (h == NULL)
{
- (*_bfd_error_handler) ("%s: no such symbol", name);
+ (*_bfd_error_handler) (_("%s: no such symbol"), name);
bfd_set_error (bfd_error_no_symbols);
return false;
}
}
}
- xcoff_hash_table (info)->debug_section->_raw_size =
- _bfd_stringtab_size (debug_strtab);
+ if (info->strip != strip_all)
+ xcoff_hash_table (info)->debug_section->_raw_size =
+ _bfd_stringtab_size (debug_strtab);
return true;
&& (h->flags & XCOFF_DEF_REGULAR) == 0
&& (h->flags & XCOFF_REF_REGULAR) != 0
&& (h->flags & XCOFF_DEF_DYNAMIC) == 0
- && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
+ && (bfd_is_abs_section (h->root.u.def.section)
+ || (h->root.u.def.section->owner->flags & DYNAMIC) == 0))
h->flags |= XCOFF_DEF_REGULAR;
/* If all defined symbols should be exported, mark them now. We
else
{
(*_bfd_error_handler)
- ("warning: attempt to export undefined symbol `%s'",
+ (_("warning: attempt to export undefined symbol `%s'"),
h->root.root.string);
h->ldsym = NULL;
return true;
o->rel_filepos = 0;
else
{
- o->flags |= SEC_RELOC;
- o->rel_filepos = rel_filepos;
- rel_filepos += o->reloc_count * relsz;
+ /* A stripped file has no relocs. However, we still
+ allocate the buffers, so that later code doesn't have to
+ worry about whether we are stripping or not. */
+ if (info->strip == strip_all)
+ o->rel_filepos = 0;
+ else
+ {
+ o->flags |= SEC_RELOC;
+ o->rel_filepos = rel_filepos;
+ rel_filepos += o->reloc_count * relsz;
+ }
/* We don't know the indices of global symbols until we have
written out all the local symbols. For each section in
struct xcoff_toc_rel_hash *toc_rel_hash;
bfd_byte *erel;
+ /* A stripped file has no relocs. */
+ if (info->strip == strip_all)
+ {
+ o->reloc_count = 0;
+ continue;
+ }
+
if (o->reloc_count == 0)
continue;
of the TOC using a 16 bit offset from tocval. This
test assumes that the TOC comes at the end of the
output section, as it does in the default linker
- script. */
+ script. FIXME: This doesn't handle .tocbss sections
+ created from XMC_TD common symbols correctly. */
tocend = ((*csectpp)->output_section->vma
+ (*csectpp)->output_section->_raw_size);
if (tocval + 0x10000 < tocend)
{
(*_bfd_error_handler)
- ("TOC overflow: 0x%lx > 0x10000; try -mminimal-toc when compiling",
+ (_("TOC overflow: 0x%lx > 0x10000; try -mminimal-toc when compiling"),
(unsigned long) (tocend - tocval));
bfd_set_error (bfd_error_file_too_big);
return false;
r_symndx = irel->r_symndx;
- if (r_symndx != -1)
+ if (r_symndx == -1)
+ h = NULL;
+ else
+ h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
+
+ if (r_symndx != -1 && finfo->info->strip != strip_all)
{
- h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
if (h != NULL
&& h->smclas != XMC_TD
&& (irel->r_type == R_TOC
else
{
(*_bfd_error_handler)
- ("%s: loader reloc in unrecognized section `%s'",
+ (_("%s: loader reloc in unrecognized section `%s'"),
bfd_get_filename (input_bfd),
sec->name);
bfd_set_error (bfd_error_nonrepresentable_section);
if (h->ldindx < 0 && ! quiet)
{
(*_bfd_error_handler)
- ("%s: `%s' in loader reloc but not loader sym",
+ (_("%s: `%s' in loader reloc but not loader sym"),
bfd_get_filename (input_bfd),
h->root.root.string);
bfd_set_error (bfd_error_bad_value);
&& ! quiet)
{
(*_bfd_error_handler)
- ("%s: loader reloc in read-only section %s",
+ (_("%s: loader reloc in read-only section %s"),
bfd_get_filename (input_bfd),
bfd_get_section_name (finfo->output_bfd,
o->output_section));
/* We need to emit a symbol to define a csect which holds the
reloc. */
- if (strlen (h->root.root.string) <= SYMNMLEN)
- strncpy (irsym._n._n_name, h->root.root.string, SYMNMLEN);
- else
+ if (finfo->info->strip != strip_all)
{
- boolean hash;
- bfd_size_type indx;
-
- hash = true;
- if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
- hash = false;
- indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash,
- false);
- if (indx == (bfd_size_type) -1)
- return false;
- irsym._n._n_n._n_zeroes = 0;
- irsym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
- }
+ if (strlen (h->root.root.string) <= SYMNMLEN)
+ strncpy (irsym._n._n_name, h->root.root.string, SYMNMLEN);
+ else
+ {
+ boolean hash;
+ bfd_size_type indx;
+
+ hash = true;
+ if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
+ hash = false;
+ indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string,
+ hash, false);
+ if (indx == (bfd_size_type) -1)
+ return false;
+ irsym._n._n_n._n_zeroes = 0;
+ irsym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
+ }
- irsym.n_value = irel->r_vaddr;
- irsym.n_scnum = osec->target_index;
- irsym.n_sclass = C_HIDEXT;
- irsym.n_type = T_NULL;
- irsym.n_numaux = 1;
+ irsym.n_value = irel->r_vaddr;
+ irsym.n_scnum = osec->target_index;
+ irsym.n_sclass = C_HIDEXT;
+ irsym.n_type = T_NULL;
+ irsym.n_numaux = 1;
- bfd_coff_swap_sym_out (output_bfd, (PTR) &irsym, (PTR) outsym);
- outsym += bfd_coff_symesz (output_bfd);
+ bfd_coff_swap_sym_out (output_bfd, (PTR) &irsym, (PTR) outsym);
+ outsym += bfd_coff_symesz (output_bfd);
- memset (&iraux, 0, sizeof iraux);
- iraux.x_csect.x_smtyp = XTY_SD;
- iraux.x_csect.x_scnlen.l = 4;
- iraux.x_csect.x_smclas = XMC_TC;
+ memset (&iraux, 0, sizeof iraux);
+ iraux.x_csect.x_smtyp = XTY_SD;
+ iraux.x_csect.x_scnlen.l = 4;
+ iraux.x_csect.x_smclas = XMC_TC;
- bfd_coff_swap_aux_out (output_bfd, (PTR) &iraux, T_NULL, C_HIDEXT, 0, 1,
- (PTR) outsym);
- outsym += bfd_coff_auxesz (output_bfd);
+ bfd_coff_swap_aux_out (output_bfd, (PTR) &iraux, T_NULL, C_HIDEXT,
+ 0, 1, (PTR) outsym);
+ outsym += bfd_coff_auxesz (output_bfd);
- if (h->indx >= 0)
- {
- /* We aren't going to write out the symbols below, so we
- need to write them out now. */
- if (bfd_seek (output_bfd,
- (obj_sym_filepos (output_bfd)
- + (obj_raw_syment_count (output_bfd)
- * bfd_coff_symesz (output_bfd))),
- SEEK_SET) != 0
- || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
- output_bfd)
- != (bfd_size_type) (outsym - finfo->outsyms)))
- return false;
- obj_raw_syment_count (output_bfd) +=
- (outsym - finfo->outsyms) / bfd_coff_symesz (output_bfd);
+ if (h->indx >= 0)
+ {
+ /* We aren't going to write out the symbols below, so we
+ need to write them out now. */
+ if (bfd_seek (output_bfd,
+ (obj_sym_filepos (output_bfd)
+ + (obj_raw_syment_count (output_bfd)
+ * bfd_coff_symesz (output_bfd))),
+ SEEK_SET) != 0
+ || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
+ output_bfd)
+ != (bfd_size_type) (outsym - finfo->outsyms)))
+ return false;
+ obj_raw_syment_count (output_bfd) +=
+ (outsym - finfo->outsyms) / bfd_coff_symesz (output_bfd);
- outsym = finfo->outsyms;
+ outsym = finfo->outsyms;
+ }
}
}
else
{
(*_bfd_error_handler)
- ("%s: loader reloc in unrecognized section `%s'",
+ (_("%s: loader reloc in unrecognized section `%s'"),
bfd_get_filename (output_bfd),
esec->output_section->name);
bfd_set_error (bfd_error_nonrepresentable_section);
else
{
(*_bfd_error_handler)
- ("%s: loader reloc in unrecognized section `%s'",
+ (_("%s: loader reloc in unrecognized section `%s'"),
bfd_get_filename (output_bfd),
tsec->output_section->name);
bfd_set_error (bfd_error_nonrepresentable_section);
++finfo->ldrel;
}
- if (h->indx >= 0)
+ if (h->indx >= 0 || finfo->info->strip == strip_all)
{
BFD_ASSERT (outsym == finfo->outsyms);
return true;
else
{
(*_bfd_error_handler)
- ("%s: loader reloc in unrecognized section `%s'",
+ (_("%s: loader reloc in unrecognized section `%s'"),
bfd_get_filename (output_bfd), secname);
bfd_set_error (bfd_error_nonrepresentable_section);
return false;
if (h->ldindx < 0)
{
(*_bfd_error_handler)
- ("%s: `%s' in loader reloc but not loader sym",
+ (_("%s: `%s' in loader reloc but not loader sym"),
bfd_get_filename (output_bfd),
h->root.root.string);
bfd_set_error (bfd_error_bad_value);
not defined by the PowerOpen ABI. */
default:
(*_bfd_error_handler)
- ("%s: unsupported relocation type 0x%02x",
+ (_("%s: unsupported relocation type 0x%02x"),
bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
bfd_set_error (bfd_error_bad_value);
return false;
if (h->toc_section == NULL)
{
(*_bfd_error_handler)
- ("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry",
+ (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
bfd_get_filename (input_bfd), rel->r_vaddr,
h->root.root.string);
bfd_set_error (bfd_error_bad_value);