and use it instead of bfd_get_symcount. Check r_index after
setting r_extern based on whether this is a base relative reloc.
(NAME(aout,swap_std_reloc_IN)): Add symcount parameter, and use it
instead of bfd_get_symcount.
(NAME(aout,slurp_reloc_table)): Pass bfd_get_symcount to reloc
swap routines.
* libaout.h (NAME(aout,swap_ext_reloc_in)): Add symcount parameter
to declaration.
(NAME(aout,swap_std_reloc_in)): Likewise.
* sunos.c (sunos_canonicalize_dynamic_reloc): Pass
info->dynsym_count to reloc swap routines.
* aout-ns32k.c (MY_swap_std_reloc_in): Add symcount parameter.
* hp300hpux.c (MY(swap_std_reloc_in)): Likewise.
(MY(slurp_reloc_table)): Pass bfd_get_symcount to reloc swap
routine.
* i386lynx.c (NAME(lynx,swap_ext_reloc_in)): Add symcount
parameter.
(NAME(lynx,swap_std_reloc_in)): Likewise.
(NAME(lynx,slurp_reloc_table)): Pass bfd_get_symcount to reloc
swap routines.
(and output_offset) if there is one.
* aoutx.h (aout_link_check_archive_element): Discard the symbols
if the archive element was not needed.
* aoutx.h (aout_get_external_symbols): Ensure that a zero string
index yields an empty string.
(aout_link_write_symbols): If info->keep_memory is false, use name
from original hash table entry, not from entry in *sym_hash.
* aoutx.h (struct aout_final_link_info): Add fields contents,
relocs, symbol_map and output_syms.
(NAME(aout,final_link)): Work out the largest section size, reloc
size, and number of symbols. Use them to preallocate buffers that
are large enough for all cases.
(aout_link_input_bfd): Use preallocated symbol_map.
(aout_link_write_symbols): Remove symbol_map argument; use
preallocated symbol_map instead. Change all callers. Use
preallocated output_syms.
(aout_link_input_section): Remove symbol_map argument. Change all
callers. Use preallocated contents and relocs.
(aout_link_input_section_std): Remove symbol_map argument; use
preallocated symbol_map instead. Change all callers.
(aout_link_input_section_ext): Likewise.
* aoutx.h (adjust_o_magic): If the .bss VMA was set outside of
BFD, pad the .data section up to the VMA of the .bss section.
(aout_link_add_symbols): If a set symbol does not get modified,
treat it as a local symbol.
(aout_link_write_symbols): Set the value of set symbols
correctly. Don't discard set symbols even if discarding local
symbols.
(aout_link_write_other_symbol): Don't abort on bfd_link_hash_new,
since it can now happen for set symbols.
It's the wrong way to do things.
(HOWTO): Change accordingly.
(HOWTO2): Remove.
(_bfd_final_link_relocate): Remove references to
special_function1.
* bfd-in2.h: Rebuilt.
* aoutx.h (aout_link_input_section_std): Remove references to
special_function1.
(aout_link_reloc_link_order): Likewise.
* libaout.h (struct aoutdata): Add field zmagic_disk_block_size.
* aout-target.h (MY(callback)): Only set alignment according to
architecture if the section sizes are aligned to that alignment,
for backward compatibility.
(MY(set_sizes)): Initialize zmagic_disk_block_size field.
* aoutx.h (adjust_z_magic): Set ztih if using q_magic_format. Set
text section filepos to zmagic_disk_block_size if not ztih. Use a
different padding algorithm if not ztih.
* i386linux.c (MY_text_includes_header): Don't define.
when computing reloc sizes. From Eric Youngdale
<ericy@cais.cais.com>.
* elfcode.h (elf_bfd_final_link): Don't try to compute maximum
reloc count or size for a non-ELF file.
enum.
* aout-target.h (MY_bfd_copy_private_bfd_data): Define as function
if not already defined. Copy subformat information.
(MY_text_includes_header): Define as 0 if not already defined.
(MY(backend_data)): Use MY_text_includes_header rather than 0.
(MY_final_link_callback): Rename from final_link_callback, and
define only if MY_final_link_callback is not already defined.
(MY_bfd_final_link): Rename use of final_link_callback to
MY_final_link_callback.
* aoutx.h (NAME(aout,some_aout_object_p)): Handle QMAGIC like
ZMAGIC, but set the subformat to q_magic_format. Abort if the
magic number if not recognized.
(adjust_z_magic): Use QMAGIC if q_magic_format.
* i386linux.c (MY_text_includes_header): Define as 1.
(i386linux_bfd_final_link): New static function.
(MY_bfd_final_link): Define as i386linux_bfd_final_link.
* aoutx.h (translate_to_native_sym_flags): Check both section and
output_section against sections of abfd.
machine type of 68000.
* aoutx.h (NAME(aout,machine_type)): Add new argument unknown.
Set *unknown to true if machine type is really unknown, as opposed
to M_UNKNOWN for the 68000.
(NAME(aout,set_arch_mach)): Change NAME(aout,machine_type) call
accordingly.
* libaout.h (NAME(aout,machine_type)): Add new argument to
prototype.
* aoutx.h (sym_in_text_section): Don't define.
(sym_in_data_section, sym_in_bss_section): Likewise.
(sym_is_undefined, sym_is_global_defn): Likewise.
(sym_is_debugger_info, sym_is_fortrancommon): Likewise.
(sym_is_absolute, sym_is_indirect): Likewise.
(translate_from_native_sym_flags): Rewrite for clarity. Rearrange
arguments and change caller. Handle weak symbols.
(translate_to_native_sym_flags): Likewise.
(aout_link_check_ar_symbols): Don't ignore weak symbols. Pull
object in from archive if a weak defintion is found for an
existing undefined symbol.
(aout_link_add_symbols): Put all cases in switch. Set flags of an
undefined symbol to 0. Handle weak symbols.
(aout_link_write_symbols): Handle weak symbols.
(aout_link_write_other_symbol): Likewise.
(aout_link_input_section_std): Likewise.
(aout_link_input_section_ext): Likewise.
* sunos.c (sunos_write_dynamic_symbol): Likewise.
Quick <stuck@cs.man.ac.uk>.
* linker.c (enum link_action): Add REF, MIND, CWARN, REFC.
(link_action): Change UNDEF_ROW/def and UNDEFW_ROW/def from NOACT
to REF. Change UNDEF_ROW/indr and UNDEFW_ROW/indr from CYCLE to
REFC. Change DEF_ROW/indr and COMMON_ROW/indr from CYCLE to MDEF.
Change DEFW_ROW/indr from CYCLE to NOACT. Change INDR_ROW/indr
from MDEF to MIND. Change INDR_ROW/warn from WARNC to CYCLE.
Change WARN_ROW/def and WARN_ROW/indr from MWARN to CWARN. Change
WARN_ROW/com from MWARN to WARN. Change WARN_ROW/warn from NOACT
to CYCLE. Change SET_ROW/warn from WARNC to CYCLE>
(_bfd_generic_link_add_one_symbol): Handle REF, MIND, CWARN and
REFC. If a new indirect symbol has been referenced, push the
reference down to the symbol it points to. FIx handling of WARN.
* aoutx.h (translate_from_native_sym_flags): If N_WARNING, don't
clobber e_type of next symbol.
(translate_to_native_sym_flags): Likewise.
(aout_link_write_symbols): Loop on bfd_link_hash_warning as well
as bfd_link_hash_indirect.
* sunos.c: Include bfdlink.h. Add many new functions and
definitions for SunOS shared library support.
* bfd-in.h (bfd_sunos_record_link_assignment): Declare.
(bfd_sunos_size_dynamic_sections): Declare.
* bfd-in2.h: Rebuilt.
* aoutx.h (struct aout_link_hash_entry): Move to libaout.h.
(struct aout_link_hash_table): Likewise.
(aout_link_hash_lookup, aout_link_hash_traverse): Likewise.
(aout_hash_table): Likewise.
(NAME(aout,link_hash_newfunc)): Rename from aout_link_hash_newfunc
and make externally visible.
(NAME(aout,link_hash_table_init)): New function.
(NAME(aout,link_hash_table_create)): Call
NAME(aout,link_hash_table_init), not _bfd_link_hash_table_init.
(aout_link_add_symbols): Don't fail if no symbols. If it exists,
call add_dynamic_symbols backend entry point for dynamic objects.
Use add_one_symbol backend entry point if it exists.
(NAME(aout,final_link)): Call finish_dynamic_link backend entry
point, if it exists.
(aout_link_input_bfd): For a dynamic object, call
link_dynamic_object backend entry point, if it exists.
(aout_link_write_other_symbol): Call write_dynamic_symbol backend
entry point, if it exists.
(aout_link_input_section): Don't read the relocs if they have
already been read.
(aout_link_input_section_std): When doing a final link, for a
reloc against an external symbol, call check_dynamic_reloc backend
entry point, if it exists.
(aout_link_input_section_ext): Likewise.
* libaout.h: Protect against multiple inclusion. Include
bfdlink.h.
(struct aout_link_hash_entry): Move in from aoutx.h.
(struct aout_link_hash_table): Likewise.
(aout_link_hash_lookup, aout_link_hash_traverse): Likewise.
(aout_hash_table): Likewise.
(struct aout_backend_data): Add fields add_dynamic_symbols,
add_one_symbol, link_dynamic_object, write_dynamic_symbol,
check_dynamic_reloc, and finish_dynamic_link.
(struct aout_section_data_struct): Define new structure.
(aout_section_data): Define new accessor macro.
(NAME(aout,link_hash_newfunc)): Declare.
(NAME(aout,link_hash_table_init)): Declare.
* aoutf1.h (sunos4_aout_backend): Initialize new aout_backend_data
fields.
* aout-target.h (MY(backend_data)): Likewise.
* i386aout.c (MY(backend_data)): Likewise.
* i386mach3.c (MY(backend_data)): Likewise.
* mipsbsd.c (MY(backend_data)): Likewise.
* sparclynx.c (sparclynx_aout_backend): Likewise.
(NAME(aout,some_aout_object_p)): Call NAME(aout,make_sections)
rather than making sections inline.
(NAME(aout,mkobject)): Don't make any sections.
(NAME(aout,adjust_sizes_and_vmas)): Call NAME(aout,make_sections).
(NAME(aout,final_link)): Don't dereference obj_textsec (abfd) or
obj_datasec (abfd) if they are NULL.
* libaout.h (NAME(aout,make_sections)): Declare.
* bout.c (b_out_mkobject): Don't make any sections.
(b_out_write_object_contents): Call aout_32_make_sections.
(b_out_set_section_contents): Likewise.
* i386os9k.c (os9k_mkobject): Don't make any sections.
(os9k_write_object_contents): Call aout_32_make_sections.
(os9k_set_section_contents): Likewise.
section->relocation is NULL; malloc might have returned NULL when
given a zero size if there were no relocations.
* bout.c (b_out_canonicalize_reloc): Likewise.
* coffcode.h (coff_canonicalize_reloc): Likewise.
* ecoff.c (ecoff_canonicalize_reloc): Likewise.
* elfcode.h (elf_canonicalize_reloc): Likewise.
* mipsbsd.c (MY(canonicalize_reloc)): Likewise.
* i386lynx.c (NAME(lynx,canonicalize_reloc)): Likewise.
* nlmcode.h (nlm_canonicalize_reloc): Likewise.
* som.c (som_canonicalize_reloc): Likewise.
* hp300hpux.c (MY(slurp_reloc_table)): Likewise. Also, if malloc
returns NULL, don't report an error if we asked for zero bytes.
* i386lynx.c (NAME(lynx,slurp_reloc_table)): If malloc returns
NULL, don't report an error if we asked for zero bytes.
* nlmcode.h (nlm_slurp_reloc_fixups): Likewise.
checks the return value and handled bfd_error correctly. These
changes are not itemised. Also:
* aoutx.h (emit_strtab): Change return type to boolean, and return
errors.
(NAME(aout,write_syms)): Check emit_strtab return value.
(NAME(aout,final_link)): Likewise.
* aoutx.h (aout_get_external_symbols): Renamed from
aout_link_get_symbols. Read strings even if symbols have been
read. Store string size in obj_aout_string_size.
(NAME(aout,slurp_symbol_table)): Call aout_get_external_symbols to
read the symbols. Allocate the cached symbols with malloc, not
bfd_alloc.
(NAME(aout,slurp_reloc_table)): Allocate the cached relocs with
malloc, not bfd_alloc.
(NAME(aout,bfd_free_cached_info)): New function; free cached
symbols and relocs.
* libaout.h (struct aoutdata): Add external_string_size field.
(obj_aout_external_string_size): New accessor macro.
(NAME(aout,close_and_cleanup)): Don't declare.
(NAME(aout,bfd_free_cached_info)): Declare.
(aout_32_close_and_cleanup): Don't define.
(aout_64_close_and_cleanup): Don't define.
* aout-target.h (MY_bfd_free_cached_info): If not already defined,
define as NAME(aout,free_cached_info).
(MY_close_and_cleanup): If not already defined, define as
MY_bfd_free_cached_info.
* aout-adobe.c (aout_32_close_and_cleanup): Define.
(aout_32_bfd_free_cached_info): Don't define.
* bout.c (aout_32_close_and_cleanup): Define.
(aout_32_bfd_free_cached_info): Don't define.
* hp300hpux.c (MY_bfd_free_cached_info): Define as bfd_true.
(MY_close_and_cleanup): Don't define.
* i386lynx.c (NAME(lynx,slurp_reloc_table)): Allocate the cached
relocs with malloc, not bfd_alloc.
* i386os9k.c (aout_32_close_and_cleanup): Define.
(aout_32_bfd_free_cached_info): Don't define.
elf32-hppa.c, elf32-mips.c, linker.c, som.c, sunos.c: If malloc(0)
returns NULL, it is not an error. It's possible that some of
these checks are not necessary (because the size can never be
zero), but putting in the checks is the conservative thing to do
in light of the fact that some of these malloc calls replaced
unchecked alloca calls, in which a zero argument would work fine.
cruft (like the #pragma alloca for AIX).
In addition to that problem, the C alloca calls xmalloc, which
means checking for being out of memory can't work right. The
following changes remove all uses of alloca from BFD.
* hosts/solaris2.h: Remove alloca cruft.
* som.c: Replace alloca with a fixed size auto array.
* aoutx.h, elfcode.h, nlmcode.h, bout.c, coff-alpha.c, ecoff.c,
ecofflink.c, elf32-hppa.c, elf32-mips.c, linker.c, reloc.c, som.c:
Replace alloca with malloc and appropriate error checking and
freeing.
* linker.c: Replace alloca with obstack_alloc.
* libbfd.h: Rebuilt.
* ecoff.c, ecofflink.c, ecoffswap.h, srec.c: Likewise.
* elf32-i386.c: Likewise.
* elfcode.h (bfd_section_from_shdr): Make i unsigned; remove old
#if 0 code.
(elf_write_phdrs): Make i unsigned.
(map_program_segments): Make i and n_left unsigned.
(assign_file_positions_except_relocs): Make i unsigned.
(write_shdrs_and_ehdr): Make count unsigned.
(assign_file_positions_for_relocs): Make i unsigned.
(NAME(bfd,elf_write_object_contents)): Make count unsigned.
(section_from_elf_index): Make index argument unsigned.