binutils-gdb/bfd/vms-tir.c

2236 lines
54 KiB
C
Raw Normal View History

1999-05-03 15:29:11 +08:00
/* vms-tir.c -- BFD back-end for VAX (openVMS/VAX) and
EVAX (openVMS/Alpha) files.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2007
Free Software Foundation, Inc.
1999-05-03 15:29:11 +08:00
TIR record handling functions
ETIR record handling functions
go and read the openVMS linker manual (esp. appendix B)
if you don't know what's going on here :-)
Written by Klaus K"ampf (kkaempf@rmi.de)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
1999-05-03 15:29:11 +08:00
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
1999-05-03 15:29:11 +08:00
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
1999-05-03 15:29:11 +08:00
/* The following type abbreviations are used:
cs counted string (ascii string with length byte)
by byte (1 byte)
sh short (2 byte, 16 bit)
lw longword (4 byte, 32 bit)
qw quadword (8 byte, 64 bit)
da data stream */
#include "sysdep.h"
#include "bfd.h"
1999-05-03 15:29:11 +08:00
#include "bfdlink.h"
#include "libbfd.h"
#include "vms.h"
1999-05-03 15:29:11 +08:00
static int
2005-04-21 15:45:39 +08:00
check_section (bfd * abfd, int size)
1999-05-03 15:29:11 +08:00
{
bfd_size_type offset;
1999-05-03 15:29:11 +08:00
offset = PRIV (image_ptr) - PRIV (image_section)->contents;
bfd/ * section.c (struct sec): Rename "_cooked_size" to "size". Rename "_raw_size" to "rawsize". (STD_SECTION): Adjust comments. (bfd_set_section_size, bfd_get_section_contents): Use size. (bfd_malloc_and_get_section): New function. * bfd-in.h (bfd_section_size, bfd_get_section_size): Use size. * coff-sh.c (sh_relax_section): Alloc coff_section_data struct early. Correctly free reloc and contents memory. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Delete FIXME and fake CIE now that we can shink section size to zero. (_bfd_elf_write_section_eh_frame): Likewise.. * elf32-ppc.c (ppc_elf_relax_section): Delay reading section contents. * elf-m10300.c (mn10300_elf_final_link_relocate): Don't use _bfd_stab_section_offset. Use _bfd_elf_section_offset. * stabs.c (_bfd_stab_section_offset_): Remove unused args and unneeded indirection. * elf.c (_bfd_elf_section_offset): .. and update call. * libbfd-in.h (_bfd_stab_section_offset): Update prototype. * libbfd.h: Regenerate. * bfd-in2.h: Regenerate. Replace occurrences of "_raw_size" and "_cooked_size" in most places with "size". Set new "rawsize" for stabs, eh_frame, and SEC_MERGE sections. Use "rawsize", if non-zero, for bfd_get_section_contents calls if the section might be a stabs, eh_frame, or SEC_MERGE section. Similarly use "rawsize", if non-zero, in reloc functions to validate reloc addresses. Use new bfd_malloc_and_get_section in most places where bfd_get_section_contents was called. Expand all occurrences of bfd_section_size and bfd_get_section_size. Rename "raw_size" var in grok_prstatus and similar functions to "size". * aix386-core.c (aix386_core_file_p): .. * aix5ppc-core.c (xcoff64_core_p): .. * aout-adobe.c (aout_adobe_callback, aout_adobe_write_object_contents, aout_adobe_set_section_contents): .. * aout-target.h (callback): .. * aout-tic30.c (tic30_aout_callback, tic30_aout_final_link_relocate, MY_bfd_final_link): .. * aoutf1.h (sunos4_core_file_p): .. * aoutx.h (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, translate_from_native_sym_flags, final_link, aout_link_input_section): .. * binary.c (binary_object_p, binary_canonicalize_symtab, binary_set_section_contents): .. * bout.c (b_out_callback, b_out_write_object_contents, b_out_set_section_contents, b_out_bfd_relax_section, b_out_bfd_get_relocated_section_contents): .. * cisco-core.c (cisco_core_file_validate): .. * coff-alpha.c (alpha_ecoff_object_p, alpha_ecoff_get_relocated_section_conten, alpha_relocate_section): .. * coff-arm.c (coff_arm_relocate_section, bfd_arm_allocate_interworking_sections): .. * coff-h8300.c (h8300_reloc16_extra_cases, h8300_bfd_link_add_symbols): .. * coff-mips.c (mips_refhi_reloc, mips_gprel_reloc): .. * coff-ppc.c (coff_ppc_relocate_section, ppc_allocate_toc_section, ppc_bfd_coff_final_link): .. * coff-rs6000.c (xcoff_reloc_type_br, xcoff_ppc_relocate_section): .. * coff-sh.c (sh_relax_section, sh_relax_delete_bytes, sh_align_loads, sh_coff_get_relocated_section_contents): .. * coff64-rs6000.c (xcoff64_write_object_contents, xcoff64_reloc_type_br, xcoff64_ppc_relocate_section): .. * coffcode.h (coff_compute_section_file_positions, coff_write_object_contents): .. * coffgen.c (make_a_section_from_file, coff_write_symbols, coff_section_symbol, build_debug_section): .. * cofflink.c (coff_link_add_symbols, _bfd_coff_final_link, process_embedded_commands, _bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): .. * cpu-arm.c (bfd_arm_update_notes, bfd_arm_get_mach_from_notes): .. * cpu-ns32k.c (do_ns32k_reloc, _bfd_ns32k_final_link_relocate): .. * dwarf1.c (parse_line_table, _bfd_dwarf1_find_nearest_line): .. * dwarf2.c (read_indirect_string, read_abbrevs, decode_line_info, _bfd_dwarf2_find_nearest_line): .. * ecoff.c (bfd_debug_section, ecoff_set_symbol_info, ecoff_compute_section_file_positions, _bfd_ecoff_write_object_contents, ecoff_indirect_link_order): .. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame, _bfd_elf_discard_section_eh_frame_hdr, _bfd_elf_maybe_strip_eh_frame_hdr, _bfd_elf_eh_frame_section_offset, _bfd_elf_write_section_eh_frame, _bfd_elf_write_section_eh_frame_hdr): .. * elf-hppa.h (elf_hppa_sort_unwind): .. * elf-m10200.c (mn10200_elf_relax_section, mn10200_elf_relax_delete_bytes, mn10200_elf_get_relocated_section_contents): .. * elf-m10300.c (_bfd_mn10300_elf_create_got_section, mn10300_elf_check_relocs, mn10300_elf_relax_section, mn10300_elf_relax_delete_bytes, mn10300_elf_get_relocated_section_contents, _bfd_mn10300_elf_adjust_dynamic_symbol, _bfd_mn10300_elf_discard_copies, _bfd_mn10300_elf_size_dynamic_sections, _bfd_mn10300_elf_finish_dynamic_sections): .. * elf.c (_bfd_elf_print_private_bfd_data, bfd_elf_get_bfd_needed_list, _bfd_elf_make_section_from_phdr, elf_fake_sections, bfd_elf_set_group_contents, map_sections_to_segments, elf_sort_sections, assign_file_positions_for_segments, SECTION_SIZE, copy_private_bfd_data, _bfd_elf_get_dynamic_reloc_upper_bound, _bfd_elf_canonicalize_dynamic_reloc, elfcore_maybe_make_sect, _bfd_elfcore_make_pseudosection, elfcore_grok_prstatus, elfcore_grok_lwpstatus, elfcore_grok_win32pstatus, elfcore_grok_note, elfcore_grok_nto_status, elfcore_grok_nto_gregs, _bfd_elf_rel_local_sym, _bfd_elf_get_synthetic_symtab): .. * elf32-arm.h (bfd_elf32_arm_allocate_interworking_sect, bfd_elf32_arm_process_before_allocation, elf32_arm_adjust_dynamic_symbol, allocate_dynrelocs, elf32_arm_size_dynamic_sections, elf32_arm_finish_dynamic_sections, elf32_arm_write_section): .. * elf32-cris.c (cris_elf_grok_prstatus, elf_cris_finish_dynamic_sections, cris_elf_gc_sweep_hook, elf_cris_adjust_gotplt_to_got, elf_cris_adjust_dynamic_symbol, cris_elf_check_relocs, elf_cris_size_dynamic_sections, elf_cris_discard_excess_dso_dynamics, elf_cris_discard_excess_program_dynamics): .. * elf32-d30v.c (bfd_elf_d30v_reloc, bfd_elf_d30v_reloc_21): .. * elf32-dlx.c (_bfd_dlx_elf_hi16_reloc): .. * elf32-frv.c (_frvfdpic_add_dyn_reloc, _frvfdpic_add_rofixup, _frv_create_got_section, _frvfdpic_assign_plt_entries, elf32_frvfdpic_size_dynamic_sections, elf32_frvfdpic_modify_segment_map, elf32_frvfdpic_finish_dynamic_sections): .. * elf32-h8300.c (elf32_h8_relax_section, elf32_h8_relax_delete_bytes, elf32_h8_get_relocated_section_contents): .. * elf32-hppa.c (hppa_build_one_stub, hppa_size_one_stub, elf32_hppa_adjust_dynamic_symbol, allocate_plt_static, allocate_dynrelocs, elf32_hppa_size_dynamic_sections, group_sections, elf32_hppa_size_stubs, elf32_hppa_set_gp, elf32_hppa_build_stubs, elf32_hppa_finish_dynamic_sections): .. * elf32-i370.c (i370_elf_adjust_dynamic_symbol, i370_elf_size_dynamic_sections, i370_elf_check_relocs, i370_elf_finish_dynamic_sections): .. * elf32-i386.c (elf_i386_grok_prstatus, elf_i386_adjust_dynamic_symbol, allocate_dynrelocs, elf_i386_size_dynamic_sections, elf_i386_relocate_section, elf_i386_finish_dynamic_sections): .. * elf32-i860.c (i860_howto_pc26_reloc, i860_howto_pc16_reloc, i860_howto_highadj_reloc, i860_howto_splitn_reloc): .. * elf32-ip2k.c (ip2k_is_switch_table_128, ip2k_relax_switch_table_128, ip2k_is_switch_table_256, ip2k_relax_switch_table_256, ip2k_elf_relax_section, adjust_all_relocations, ip2k_elf_relax_delete_bytes): .. * elf32-m32r.c (m32r_elf_do_10_pcrel_reloc, m32r_elf_hi16_reloc, m32r_elf_generic_reloc, m32r_elf_adjust_dynamic_symbol, allocate_dynrelocs, m32r_elf_size_dynamic_sections, m32r_elf_relocate_section, m32r_elf_finish_dynamic_sections, m32r_elf_relax_section, m32r_elf_relax_delete_bytes, m32r_elf_get_relocated_section_contents): .. * elf32-m68hc11.c (m68hc11_elf_build_one_stub, m68hc11_elf_size_one_stub, m68hc11_elf_relax_section, m68hc11_elf_relax_delete_bytes): .. * elf32-m68hc12.c (m68hc12_elf_build_one_stub, m68hc12_elf_size_one_stub): .. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs, elf32_m68hc11_build_stubs, m68hc11_elf_special_reloc): .. * elf32-m68k.c (elf_m68k_check_relocs, elf_m68k_gc_sweep_hook, elf_m68k_adjust_dynamic_symbol, elf_m68k_size_dynamic_sections, elf_m68k_discard_copies, elf_m68k_finish_dynamic_sections): .. * elf32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elf32-or32.c (or32_elf_consth_reloc): .. * elf32-ppc.c (ppc_elf_relax_section, ppc_elf_addr16_ha_reloc, elf_create_pointer_linker_section, ppc_elf_create_linker_section, ppc_elf_additional_program_headers, ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs, ppc_elf_size_dynamic_sections, ppc_elf_finish_dynamic_sections, ppc_elf_grok_prstatus, ppc_elf_final_write_processing): .. * elf32-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections, elf_s390_grok_prstatus): .. * elf32-sh.c (sh_elf_reloc_loop, sh_elf_relax_section, sh_elf_relax_delete_bytes, sh_elf_align_loads, sh_elf_adjust_dynamic_symbol, allocate_dynrelocs, sh_elf_size_dynamic_sections, sh_elf_get_relocated_section_contents, sh_elf_finish_dynamic_sections, elf32_shlin_grok_prstatus): .. * elf32-sh64-com.c (sh64_address_in_cranges, sh64_get_contents_type): .. * elf32-sh64.c (sh64_find_section_for_address, sh64_elf_final_write_processing): .. * elf32-sparc.c (sparc_elf_wdisp16_reloc, sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_adjust_dynamic_symbol, allocate_dynrelocs, elf32_sparc_size_dynamic_sections, elf32_sparc_relocate_section, elf32_sparc_finish_dynamic_sections): .. * elf32-v850.c (v850_elf_reloc, v850_elf_relax_section): .. * elf32-vax.c (elf_vax_check_relocs, elf_vax_adjust_dynamic_symbol, elf_vax_size_dynamic_sections, elf_vax_discard_copies, elf_vax_instantiate_got_entries, elf_vax_relocate_section, elf_vax_finish_dynamic_sections): .. * elf32-xstormy16.c (xstormy16_elf_24_reloc, xstormy16_elf_check_relocs, xstormy16_relax_plt_check, xstormy16_elf_relax_section, xstormy16_elf_always_size_sections, xstormy16_elf_finish_dynamic_sections): .. * elf32-xtensa.c (xtensa_read_table_entries, elf_xtensa_allocate_got_size, elf_xtensa_allocate_local_got_size, elf_xtensa_size_dynamic_sections, elf_xtensa_do_reloc, bfd_elf_xtensa_reloc, elf_xtensa_relocate_section, elf_xtensa_combine_prop_entries, elf_xtensa_finish_dynamic_sections, elf_xtensa_discard_info_for_section, elf_xtensa_grok_prstatus, get_relocation_opcode, retrieve_contents, find_relaxable_sections, collect_source_relocs, is_resolvable_asm_expansion, remove_literals, relax_section, shrink_dynamic_reloc_sections, relax_property_section, xtensa_callback_required_dependence): .. * elf64-alpha.c (elf64_alpha_reloc_gpdisp, elf64_alpha_relax_section, elf64_alpha_check_relocs, elf64_alpha_adjust_dynamic_symbol, elf64_alpha_calc_got_offsets_for_symbol, elf64_alpha_calc_got_offsets, elf64_alpha_size_plt_section, elf64_alpha_size_plt_section_1, elf64_alpha_always_size_sections, elf64_alpha_calc_dynrel_sizes, elf64_alpha_size_rela_got_section, elf64_alpha_size_rela_got_1, elf64_alpha_size_dynamic_sections, elf64_alpha_emit_dynrel, elf64_alpha_finish_dynamic_sections, elf64_alpha_final_link): .. * elf64-hppa.c (allocate_dynrel_entries, elf64_hppa_size_dynamic_sections, elf64_hppa_finish_dynamic_sections): .. * elf64-mips.c (mips_elf64_gprel32_reloc, mips16_gprel_reloc, mips_elf64_canonicalize_dynamic_reloc, mips_elf64_slurp_reloc_table, elf64_mips_grok_prstatus): .. * elf64-mmix.c (mmix_elf_perform_relocation, mmix_elf_reloc, mmix_elf_relocate_section, mmix_elf_final_link, mmix_set_relaxable_size, _bfd_mmix_after_linker_allocation, mmix_elf_relax_section, mmix_elf_get_section_contents): .. * elf64-ppc.c (ppc64_elf_object_p, ppc64_elf_grok_prstatus, ppc64_elf_check_relocs, ppc64_elf_func_desc_adjust, ppc64_elf_adjust_dynamic_symbol, ppc64_elf_edit_opd, allocate_dynrelocs, ppc64_elf_size_dynamic_sections, ppc_build_one_stub, ppc_size_one_stub, ppc64_elf_next_toc_section, toc_adjusting_stub_needed, group_sections, ppc64_elf_size_stubs, ppc64_elf_build_stubs, ppc64_elf_relocate_section, ppc64_elf_finish_dynamic_sections): .. * elf64-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections): .. * elf64-sh64.c (sh_elf64_get_relocated_section_contents, sh_elf64_check_relocs, sh64_elf64_adjust_dynamic_symbol, sh64_elf64_discard_copies, sh64_elf64_size_dynamic_sections, sh64_elf64_finish_dynamic_sections): .. * elf64-sparc.c (sparc64_elf_slurp_reloc_table, init_insn_reloc, sparc64_elf_check_relocs, sparc64_elf_adjust_dynamic_symbol, sparc64_elf_size_dynamic_sections, sparc64_elf_relocate_section, sparc64_elf_finish_dynamic_symbol, sparc64_elf_finish_dynamic_sections): .. * elf64-x86-64.c (elf64_x86_64_grok_prstatus, elf64_x86_64_adjust_dynamic_symbol, allocate_dynrelocs, elf64_x86_64_size_dynamic_sections, elf64_x86_64_relocate_section, elf64_x86_64_finish_dynamic_sections): .. * elfarm-nabi.c (elf32_arm_nabi_grok_prstatus): .. * elfcode.h (elf_slurp_reloc_table): .. * elflink.c (_bfd_elf_create_got_section, elf_add_dt_needed_tag, elf_finalize_dynstr, elf_link_add_object_symbols, bfd_elf_size_dynamic_sections, elf_link_sort_relocs, elf_link_input_bfd, bfd_elf_final_link, bfd_elf_discard_info): .. * elfn32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elfxx-ia64.c (elfNN_ia64_relax_section, allocate_dynrel_entries, elfNN_ia64_size_dynamic_sections, elfNN_ia64_install_dyn_reloc, elfNN_ia64_choose_gp, elfNN_ia64_final_link, elfNN_ia64_finish_dynamic_sections): .. * elfxx-mips.c (mips_elf_create_procedure_table, mips_elf_check_mips16_stubs, _bfd_mips_elf_gprel16_with_gp, _bfd_mips_elf_hi16_reloc, _bfd_mips_elf_generic_reloc, mips_elf_global_got_index, mips_elf_multi_got, mips_elf_create_compact_rel_section, mips_elf_calculate_relocation, mips_elf_allocate_dynamic_relocations, mips_elf_create_dynamic_relocation, _bfd_mips_elf_fake_sections, _bfd_mips_relax_section, _bfd_mips_elf_adjust_dynamic_symbol, _bfd_mips_elf_always_size_sections, _bfd_mips_elf_size_dynamic_sections, _bfd_mips_elf_finish_dynamic_symbol, _bfd_mips_elf_finish_dynamic_sections, _bfd_mips_elf_modify_segment_map, _bfd_mips_elf_discard_info, _bfd_mips_elf_write_section, _bfd_mips_elf_set_section_contents, _bfd_elf_mips_get_relocated_section_contents, _bfd_mips_elf_final_link, _bfd_mips_elf_merge_private_bfd_data): .. * hp300hpux.c (callback): .. * hppabsd-core.c (make_bfd_asection): .. * hpux-core.c (make_bfd_asection): .. * i386linux.c (linux_link_create_dynamic_sections, bfd_i386linux_size_dynamic_sections, linux_finish_dynamic_link): .. * i386msdos.c (msdos_write_object_contents): .. * i386os9k.c (os9k_callback, os9k_write_object_contents, os9k_set_section_contents): .. * ieee.c (parse_expression, ieee_slurp_external_symbols, ieee_slurp_sections, ieee_slurp_debug, ieee_slurp_section_data, ieee_write_section_part, do_with_relocs, do_as_repeat, do_without_relocs, ieee_write_debug_part, init_for_output, ieee_set_section_contents): .. * ihex.c (ihex_scan, ihex_read_section, ihex_get_section_contents): .. * irix-core.c (do_sections, make_bfd_asection): .. * libaout.h (aout_section_merge_with_text_p): .. * libbfd.c (_bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window): .. * linker.c (default_indirect_link_order): .. * lynx-core.c (make_bfd_asection): .. * m68klinux.c (linux_link_create_dynamic_sections, bfd_m68klinux_size_dynamic_sections, linux_finish_dynamic_link): .. * mach-o.c (bfd_mach_o_make_bfd_section, bfd_mach_o_scan_read_dylinker, bfd_mach_o_scan_read_dylib, bfd_mach_o_scan_read_thread, bfd_mach_o_scan_read_symtab, bfd_mach_o_scan_read_segment): .. * merge.c (_bfd_add_merge_section, record_section, merge_strings, _bfd_merge_sections): .. * mmo.c (mmo_find_sec_w_addr, mmo_get_spec_section, mmo_get_loc, mmo_map_set_sizes, mmo_canonicalize_symtab, mmo_internal_write_section, mmo_write_object_contents): .. * netbsd-core.c (netbsd_core_file_p): .. * nlm32-alpha.c (nlm_alpha_read_reloc, nlm_alpha_write_import, nlm_alpha_set_public_section): .. * nlm32-ppc.c (nlm_powerpc_read_reloc, nlm_powerpc_write_reloc): .. * nlm32-sparc.c (nlm_sparc_write_import): .. * nlmcode.h (add_bfd_section, nlm_swap_auxiliary_headers_in, nlm_compute_section_file_positions): .. * oasys.c (oasys_object_p, oasys_slurp_section_data, oasys_write_sections, oasys_write_data, oasys_set_section_contents): .. * opncls.c (get_debug_link_info): .. * osf-core.c (make_bfd_asection): .. * pdp11.c (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, squirt_out_relocs, final_link, aout_link_input_section): .. * peXXigen.c (_bfd_XXi_swap_sym_in, _bfd_XXi_swap_aouthdr_out, pe_print_idata, pe_print_edata, pe_print_pdata, pe_print_reloc): .. * pef.c (bfd_pef_make_bfd_section, bfd_pef_print_loader_section, bfd_pef_scan_start_address, bfd_pef_parse_symbols): .. * ppcboot.c (ppcboot_object_p, ppcboot_canonicalize_symtab): .. * ptrace-core.c (ptrace_unix_core_file_p): .. * reloc.c (bfd_perform_relocation, bfd_install_relocation, _bfd_final_link_relocate, bfd_generic_relax_section, bfd_generic_get_relocated_section_contents): .. * reloc16.c (bfd_coff_reloc16_relax_section, bfd_coff_reloc16_get_relocated_section_c): .. * riscix.c (riscix_some_aout_object_p): .. * rs6000-core.c (read_hdr, make_bfd_asection): .. * sco5-core.c (make_bfd_asection): .. * simple.c (bfd_simple_get_relocated_section_contents): .. * som.c (som_object_setup, setup_sections, som_prep_headers, som_write_fixups, som_begin_writing, bfd_section_from_som_symbol, som_set_reloc_info, som_get_section_contents, som_bfd_link_split_section): .. * sparclinux.c (linux_link_create_dynamic_sections, bfd_sparclinux_size_dynamic_sections, linux_finish_dynamic_link): .. * srec.c (srec_scan, srec_read_section, srec_get_section_contents): .. * stabs.c (_bfd_link_section_stabs, _bfd_discard_section_stabs, _bfd_write_stab_strings, _bfd_stab_section_offset): .. * sunos.c (sunos_read_dynamic_info, sunos_create_dynamic_sections, bfd_sunos_size_dynamic_sections, sunos_scan_std_relocs, sunos_scan_ext_relocs, sunos_scan_dynamic_symbol, sunos_write_dynamic_symbol, sunos_check_dynamic_reloc, sunos_finish_dynamic_link): .. * syms.c (_bfd_stab_section_find_nearest_line): .. * tekhex.c (first_phase, tekhex_set_section_contents, tekhex_write_object_contents): .. * trad-core.c (trad_unix_core_file_p): .. * versados.c (process_esd, process_otr, process_otr): .. * vms-gsd.c (_bfd_vms_slurp_gsd, _bfd_vms_write_gsd): .. * vms-misc.c (add_new_contents): .. * vms-tir.c (check_section, new_section, _bfd_vms_write_tir): .. * vms.c (vms_set_section_contents): .. * xcofflink.c (xcoff_get_section_contents, xcoff_link_add_symbols, xcoff_sweep, bfd_xcoff_size_dynamic_sections, xcoff_build_ldsyms, _bfd_xcoff_bfd_final_link, xcoff_link_input_bfd): .. * xsym.c (bfd_sym_scan): .. See above. binutils/ * objcopy.c (copy_section): Don't set _cooked_size. include/ * bfdlink.h (struct bfd_link_order): Update comment. ld/ * ldlang.c (print_output_section_statement): Don't print size before relaxation. (IGNORE_SECTION): Remove bfd arg. Update all callers. * ldexp.c (fold_name): .. See below. * ldlang.c (section_already_linked, print_output_section_statement, print_input_section, insert_pad, size_input_section, lang_check_section_addresses, lang_size_sections_1, lang_size_sections, lang_do_assignments_1, lang_set_startof, lang_one_common, lang_reset_memory_regions, lang_process, lang_abs_symbol_at_end_of, lang_do_version_exports_section): .. * ldwrite.c (build_link_order, clone_section, ds, split_sections): .. * pe-dll.c (process_def_file, generate_reloc): .. * emultempl/elf32.em (gld${EMULATION_NAME}_find_statement_assignment, gld${EMULATION_NAME}_before_allocation): .. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): .. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_before_allocation, sh64_elf_${EMULATION_NAME}_after_allocation): .. * emultempl/sunos.em (gld${EMULATION_NAME}_before_allocation): .. * emultempl/xtensaelf.em (ld_assign_relative_paged_dot, ld_local_file_relocations_fit, ld_xtensa_insert_page_offsets): Use "size" instead of "_raw_size" and "_cooked_size". Expand bfd_section_size macro invocations.
2004-06-24 12:46:28 +08:00
if (offset + size > PRIV (image_section)->size)
1999-05-03 15:29:11 +08:00
{
PRIV (image_section)->contents
= bfd_realloc (PRIV (image_section)->contents, offset + size);
if (PRIV (image_section)->contents == 0)
1999-05-03 15:29:11 +08:00
{
(*_bfd_error_handler) (_("No Mem !"));
return -1;
}
bfd/ * section.c (struct sec): Rename "_cooked_size" to "size". Rename "_raw_size" to "rawsize". (STD_SECTION): Adjust comments. (bfd_set_section_size, bfd_get_section_contents): Use size. (bfd_malloc_and_get_section): New function. * bfd-in.h (bfd_section_size, bfd_get_section_size): Use size. * coff-sh.c (sh_relax_section): Alloc coff_section_data struct early. Correctly free reloc and contents memory. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Delete FIXME and fake CIE now that we can shink section size to zero. (_bfd_elf_write_section_eh_frame): Likewise.. * elf32-ppc.c (ppc_elf_relax_section): Delay reading section contents. * elf-m10300.c (mn10300_elf_final_link_relocate): Don't use _bfd_stab_section_offset. Use _bfd_elf_section_offset. * stabs.c (_bfd_stab_section_offset_): Remove unused args and unneeded indirection. * elf.c (_bfd_elf_section_offset): .. and update call. * libbfd-in.h (_bfd_stab_section_offset): Update prototype. * libbfd.h: Regenerate. * bfd-in2.h: Regenerate. Replace occurrences of "_raw_size" and "_cooked_size" in most places with "size". Set new "rawsize" for stabs, eh_frame, and SEC_MERGE sections. Use "rawsize", if non-zero, for bfd_get_section_contents calls if the section might be a stabs, eh_frame, or SEC_MERGE section. Similarly use "rawsize", if non-zero, in reloc functions to validate reloc addresses. Use new bfd_malloc_and_get_section in most places where bfd_get_section_contents was called. Expand all occurrences of bfd_section_size and bfd_get_section_size. Rename "raw_size" var in grok_prstatus and similar functions to "size". * aix386-core.c (aix386_core_file_p): .. * aix5ppc-core.c (xcoff64_core_p): .. * aout-adobe.c (aout_adobe_callback, aout_adobe_write_object_contents, aout_adobe_set_section_contents): .. * aout-target.h (callback): .. * aout-tic30.c (tic30_aout_callback, tic30_aout_final_link_relocate, MY_bfd_final_link): .. * aoutf1.h (sunos4_core_file_p): .. * aoutx.h (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, translate_from_native_sym_flags, final_link, aout_link_input_section): .. * binary.c (binary_object_p, binary_canonicalize_symtab, binary_set_section_contents): .. * bout.c (b_out_callback, b_out_write_object_contents, b_out_set_section_contents, b_out_bfd_relax_section, b_out_bfd_get_relocated_section_contents): .. * cisco-core.c (cisco_core_file_validate): .. * coff-alpha.c (alpha_ecoff_object_p, alpha_ecoff_get_relocated_section_conten, alpha_relocate_section): .. * coff-arm.c (coff_arm_relocate_section, bfd_arm_allocate_interworking_sections): .. * coff-h8300.c (h8300_reloc16_extra_cases, h8300_bfd_link_add_symbols): .. * coff-mips.c (mips_refhi_reloc, mips_gprel_reloc): .. * coff-ppc.c (coff_ppc_relocate_section, ppc_allocate_toc_section, ppc_bfd_coff_final_link): .. * coff-rs6000.c (xcoff_reloc_type_br, xcoff_ppc_relocate_section): .. * coff-sh.c (sh_relax_section, sh_relax_delete_bytes, sh_align_loads, sh_coff_get_relocated_section_contents): .. * coff64-rs6000.c (xcoff64_write_object_contents, xcoff64_reloc_type_br, xcoff64_ppc_relocate_section): .. * coffcode.h (coff_compute_section_file_positions, coff_write_object_contents): .. * coffgen.c (make_a_section_from_file, coff_write_symbols, coff_section_symbol, build_debug_section): .. * cofflink.c (coff_link_add_symbols, _bfd_coff_final_link, process_embedded_commands, _bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): .. * cpu-arm.c (bfd_arm_update_notes, bfd_arm_get_mach_from_notes): .. * cpu-ns32k.c (do_ns32k_reloc, _bfd_ns32k_final_link_relocate): .. * dwarf1.c (parse_line_table, _bfd_dwarf1_find_nearest_line): .. * dwarf2.c (read_indirect_string, read_abbrevs, decode_line_info, _bfd_dwarf2_find_nearest_line): .. * ecoff.c (bfd_debug_section, ecoff_set_symbol_info, ecoff_compute_section_file_positions, _bfd_ecoff_write_object_contents, ecoff_indirect_link_order): .. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame, _bfd_elf_discard_section_eh_frame_hdr, _bfd_elf_maybe_strip_eh_frame_hdr, _bfd_elf_eh_frame_section_offset, _bfd_elf_write_section_eh_frame, _bfd_elf_write_section_eh_frame_hdr): .. * elf-hppa.h (elf_hppa_sort_unwind): .. * elf-m10200.c (mn10200_elf_relax_section, mn10200_elf_relax_delete_bytes, mn10200_elf_get_relocated_section_contents): .. * elf-m10300.c (_bfd_mn10300_elf_create_got_section, mn10300_elf_check_relocs, mn10300_elf_relax_section, mn10300_elf_relax_delete_bytes, mn10300_elf_get_relocated_section_contents, _bfd_mn10300_elf_adjust_dynamic_symbol, _bfd_mn10300_elf_discard_copies, _bfd_mn10300_elf_size_dynamic_sections, _bfd_mn10300_elf_finish_dynamic_sections): .. * elf.c (_bfd_elf_print_private_bfd_data, bfd_elf_get_bfd_needed_list, _bfd_elf_make_section_from_phdr, elf_fake_sections, bfd_elf_set_group_contents, map_sections_to_segments, elf_sort_sections, assign_file_positions_for_segments, SECTION_SIZE, copy_private_bfd_data, _bfd_elf_get_dynamic_reloc_upper_bound, _bfd_elf_canonicalize_dynamic_reloc, elfcore_maybe_make_sect, _bfd_elfcore_make_pseudosection, elfcore_grok_prstatus, elfcore_grok_lwpstatus, elfcore_grok_win32pstatus, elfcore_grok_note, elfcore_grok_nto_status, elfcore_grok_nto_gregs, _bfd_elf_rel_local_sym, _bfd_elf_get_synthetic_symtab): .. * elf32-arm.h (bfd_elf32_arm_allocate_interworking_sect, bfd_elf32_arm_process_before_allocation, elf32_arm_adjust_dynamic_symbol, allocate_dynrelocs, elf32_arm_size_dynamic_sections, elf32_arm_finish_dynamic_sections, elf32_arm_write_section): .. * elf32-cris.c (cris_elf_grok_prstatus, elf_cris_finish_dynamic_sections, cris_elf_gc_sweep_hook, elf_cris_adjust_gotplt_to_got, elf_cris_adjust_dynamic_symbol, cris_elf_check_relocs, elf_cris_size_dynamic_sections, elf_cris_discard_excess_dso_dynamics, elf_cris_discard_excess_program_dynamics): .. * elf32-d30v.c (bfd_elf_d30v_reloc, bfd_elf_d30v_reloc_21): .. * elf32-dlx.c (_bfd_dlx_elf_hi16_reloc): .. * elf32-frv.c (_frvfdpic_add_dyn_reloc, _frvfdpic_add_rofixup, _frv_create_got_section, _frvfdpic_assign_plt_entries, elf32_frvfdpic_size_dynamic_sections, elf32_frvfdpic_modify_segment_map, elf32_frvfdpic_finish_dynamic_sections): .. * elf32-h8300.c (elf32_h8_relax_section, elf32_h8_relax_delete_bytes, elf32_h8_get_relocated_section_contents): .. * elf32-hppa.c (hppa_build_one_stub, hppa_size_one_stub, elf32_hppa_adjust_dynamic_symbol, allocate_plt_static, allocate_dynrelocs, elf32_hppa_size_dynamic_sections, group_sections, elf32_hppa_size_stubs, elf32_hppa_set_gp, elf32_hppa_build_stubs, elf32_hppa_finish_dynamic_sections): .. * elf32-i370.c (i370_elf_adjust_dynamic_symbol, i370_elf_size_dynamic_sections, i370_elf_check_relocs, i370_elf_finish_dynamic_sections): .. * elf32-i386.c (elf_i386_grok_prstatus, elf_i386_adjust_dynamic_symbol, allocate_dynrelocs, elf_i386_size_dynamic_sections, elf_i386_relocate_section, elf_i386_finish_dynamic_sections): .. * elf32-i860.c (i860_howto_pc26_reloc, i860_howto_pc16_reloc, i860_howto_highadj_reloc, i860_howto_splitn_reloc): .. * elf32-ip2k.c (ip2k_is_switch_table_128, ip2k_relax_switch_table_128, ip2k_is_switch_table_256, ip2k_relax_switch_table_256, ip2k_elf_relax_section, adjust_all_relocations, ip2k_elf_relax_delete_bytes): .. * elf32-m32r.c (m32r_elf_do_10_pcrel_reloc, m32r_elf_hi16_reloc, m32r_elf_generic_reloc, m32r_elf_adjust_dynamic_symbol, allocate_dynrelocs, m32r_elf_size_dynamic_sections, m32r_elf_relocate_section, m32r_elf_finish_dynamic_sections, m32r_elf_relax_section, m32r_elf_relax_delete_bytes, m32r_elf_get_relocated_section_contents): .. * elf32-m68hc11.c (m68hc11_elf_build_one_stub, m68hc11_elf_size_one_stub, m68hc11_elf_relax_section, m68hc11_elf_relax_delete_bytes): .. * elf32-m68hc12.c (m68hc12_elf_build_one_stub, m68hc12_elf_size_one_stub): .. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs, elf32_m68hc11_build_stubs, m68hc11_elf_special_reloc): .. * elf32-m68k.c (elf_m68k_check_relocs, elf_m68k_gc_sweep_hook, elf_m68k_adjust_dynamic_symbol, elf_m68k_size_dynamic_sections, elf_m68k_discard_copies, elf_m68k_finish_dynamic_sections): .. * elf32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elf32-or32.c (or32_elf_consth_reloc): .. * elf32-ppc.c (ppc_elf_relax_section, ppc_elf_addr16_ha_reloc, elf_create_pointer_linker_section, ppc_elf_create_linker_section, ppc_elf_additional_program_headers, ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs, ppc_elf_size_dynamic_sections, ppc_elf_finish_dynamic_sections, ppc_elf_grok_prstatus, ppc_elf_final_write_processing): .. * elf32-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections, elf_s390_grok_prstatus): .. * elf32-sh.c (sh_elf_reloc_loop, sh_elf_relax_section, sh_elf_relax_delete_bytes, sh_elf_align_loads, sh_elf_adjust_dynamic_symbol, allocate_dynrelocs, sh_elf_size_dynamic_sections, sh_elf_get_relocated_section_contents, sh_elf_finish_dynamic_sections, elf32_shlin_grok_prstatus): .. * elf32-sh64-com.c (sh64_address_in_cranges, sh64_get_contents_type): .. * elf32-sh64.c (sh64_find_section_for_address, sh64_elf_final_write_processing): .. * elf32-sparc.c (sparc_elf_wdisp16_reloc, sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_adjust_dynamic_symbol, allocate_dynrelocs, elf32_sparc_size_dynamic_sections, elf32_sparc_relocate_section, elf32_sparc_finish_dynamic_sections): .. * elf32-v850.c (v850_elf_reloc, v850_elf_relax_section): .. * elf32-vax.c (elf_vax_check_relocs, elf_vax_adjust_dynamic_symbol, elf_vax_size_dynamic_sections, elf_vax_discard_copies, elf_vax_instantiate_got_entries, elf_vax_relocate_section, elf_vax_finish_dynamic_sections): .. * elf32-xstormy16.c (xstormy16_elf_24_reloc, xstormy16_elf_check_relocs, xstormy16_relax_plt_check, xstormy16_elf_relax_section, xstormy16_elf_always_size_sections, xstormy16_elf_finish_dynamic_sections): .. * elf32-xtensa.c (xtensa_read_table_entries, elf_xtensa_allocate_got_size, elf_xtensa_allocate_local_got_size, elf_xtensa_size_dynamic_sections, elf_xtensa_do_reloc, bfd_elf_xtensa_reloc, elf_xtensa_relocate_section, elf_xtensa_combine_prop_entries, elf_xtensa_finish_dynamic_sections, elf_xtensa_discard_info_for_section, elf_xtensa_grok_prstatus, get_relocation_opcode, retrieve_contents, find_relaxable_sections, collect_source_relocs, is_resolvable_asm_expansion, remove_literals, relax_section, shrink_dynamic_reloc_sections, relax_property_section, xtensa_callback_required_dependence): .. * elf64-alpha.c (elf64_alpha_reloc_gpdisp, elf64_alpha_relax_section, elf64_alpha_check_relocs, elf64_alpha_adjust_dynamic_symbol, elf64_alpha_calc_got_offsets_for_symbol, elf64_alpha_calc_got_offsets, elf64_alpha_size_plt_section, elf64_alpha_size_plt_section_1, elf64_alpha_always_size_sections, elf64_alpha_calc_dynrel_sizes, elf64_alpha_size_rela_got_section, elf64_alpha_size_rela_got_1, elf64_alpha_size_dynamic_sections, elf64_alpha_emit_dynrel, elf64_alpha_finish_dynamic_sections, elf64_alpha_final_link): .. * elf64-hppa.c (allocate_dynrel_entries, elf64_hppa_size_dynamic_sections, elf64_hppa_finish_dynamic_sections): .. * elf64-mips.c (mips_elf64_gprel32_reloc, mips16_gprel_reloc, mips_elf64_canonicalize_dynamic_reloc, mips_elf64_slurp_reloc_table, elf64_mips_grok_prstatus): .. * elf64-mmix.c (mmix_elf_perform_relocation, mmix_elf_reloc, mmix_elf_relocate_section, mmix_elf_final_link, mmix_set_relaxable_size, _bfd_mmix_after_linker_allocation, mmix_elf_relax_section, mmix_elf_get_section_contents): .. * elf64-ppc.c (ppc64_elf_object_p, ppc64_elf_grok_prstatus, ppc64_elf_check_relocs, ppc64_elf_func_desc_adjust, ppc64_elf_adjust_dynamic_symbol, ppc64_elf_edit_opd, allocate_dynrelocs, ppc64_elf_size_dynamic_sections, ppc_build_one_stub, ppc_size_one_stub, ppc64_elf_next_toc_section, toc_adjusting_stub_needed, group_sections, ppc64_elf_size_stubs, ppc64_elf_build_stubs, ppc64_elf_relocate_section, ppc64_elf_finish_dynamic_sections): .. * elf64-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections): .. * elf64-sh64.c (sh_elf64_get_relocated_section_contents, sh_elf64_check_relocs, sh64_elf64_adjust_dynamic_symbol, sh64_elf64_discard_copies, sh64_elf64_size_dynamic_sections, sh64_elf64_finish_dynamic_sections): .. * elf64-sparc.c (sparc64_elf_slurp_reloc_table, init_insn_reloc, sparc64_elf_check_relocs, sparc64_elf_adjust_dynamic_symbol, sparc64_elf_size_dynamic_sections, sparc64_elf_relocate_section, sparc64_elf_finish_dynamic_symbol, sparc64_elf_finish_dynamic_sections): .. * elf64-x86-64.c (elf64_x86_64_grok_prstatus, elf64_x86_64_adjust_dynamic_symbol, allocate_dynrelocs, elf64_x86_64_size_dynamic_sections, elf64_x86_64_relocate_section, elf64_x86_64_finish_dynamic_sections): .. * elfarm-nabi.c (elf32_arm_nabi_grok_prstatus): .. * elfcode.h (elf_slurp_reloc_table): .. * elflink.c (_bfd_elf_create_got_section, elf_add_dt_needed_tag, elf_finalize_dynstr, elf_link_add_object_symbols, bfd_elf_size_dynamic_sections, elf_link_sort_relocs, elf_link_input_bfd, bfd_elf_final_link, bfd_elf_discard_info): .. * elfn32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elfxx-ia64.c (elfNN_ia64_relax_section, allocate_dynrel_entries, elfNN_ia64_size_dynamic_sections, elfNN_ia64_install_dyn_reloc, elfNN_ia64_choose_gp, elfNN_ia64_final_link, elfNN_ia64_finish_dynamic_sections): .. * elfxx-mips.c (mips_elf_create_procedure_table, mips_elf_check_mips16_stubs, _bfd_mips_elf_gprel16_with_gp, _bfd_mips_elf_hi16_reloc, _bfd_mips_elf_generic_reloc, mips_elf_global_got_index, mips_elf_multi_got, mips_elf_create_compact_rel_section, mips_elf_calculate_relocation, mips_elf_allocate_dynamic_relocations, mips_elf_create_dynamic_relocation, _bfd_mips_elf_fake_sections, _bfd_mips_relax_section, _bfd_mips_elf_adjust_dynamic_symbol, _bfd_mips_elf_always_size_sections, _bfd_mips_elf_size_dynamic_sections, _bfd_mips_elf_finish_dynamic_symbol, _bfd_mips_elf_finish_dynamic_sections, _bfd_mips_elf_modify_segment_map, _bfd_mips_elf_discard_info, _bfd_mips_elf_write_section, _bfd_mips_elf_set_section_contents, _bfd_elf_mips_get_relocated_section_contents, _bfd_mips_elf_final_link, _bfd_mips_elf_merge_private_bfd_data): .. * hp300hpux.c (callback): .. * hppabsd-core.c (make_bfd_asection): .. * hpux-core.c (make_bfd_asection): .. * i386linux.c (linux_link_create_dynamic_sections, bfd_i386linux_size_dynamic_sections, linux_finish_dynamic_link): .. * i386msdos.c (msdos_write_object_contents): .. * i386os9k.c (os9k_callback, os9k_write_object_contents, os9k_set_section_contents): .. * ieee.c (parse_expression, ieee_slurp_external_symbols, ieee_slurp_sections, ieee_slurp_debug, ieee_slurp_section_data, ieee_write_section_part, do_with_relocs, do_as_repeat, do_without_relocs, ieee_write_debug_part, init_for_output, ieee_set_section_contents): .. * ihex.c (ihex_scan, ihex_read_section, ihex_get_section_contents): .. * irix-core.c (do_sections, make_bfd_asection): .. * libaout.h (aout_section_merge_with_text_p): .. * libbfd.c (_bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window): .. * linker.c (default_indirect_link_order): .. * lynx-core.c (make_bfd_asection): .. * m68klinux.c (linux_link_create_dynamic_sections, bfd_m68klinux_size_dynamic_sections, linux_finish_dynamic_link): .. * mach-o.c (bfd_mach_o_make_bfd_section, bfd_mach_o_scan_read_dylinker, bfd_mach_o_scan_read_dylib, bfd_mach_o_scan_read_thread, bfd_mach_o_scan_read_symtab, bfd_mach_o_scan_read_segment): .. * merge.c (_bfd_add_merge_section, record_section, merge_strings, _bfd_merge_sections): .. * mmo.c (mmo_find_sec_w_addr, mmo_get_spec_section, mmo_get_loc, mmo_map_set_sizes, mmo_canonicalize_symtab, mmo_internal_write_section, mmo_write_object_contents): .. * netbsd-core.c (netbsd_core_file_p): .. * nlm32-alpha.c (nlm_alpha_read_reloc, nlm_alpha_write_import, nlm_alpha_set_public_section): .. * nlm32-ppc.c (nlm_powerpc_read_reloc, nlm_powerpc_write_reloc): .. * nlm32-sparc.c (nlm_sparc_write_import): .. * nlmcode.h (add_bfd_section, nlm_swap_auxiliary_headers_in, nlm_compute_section_file_positions): .. * oasys.c (oasys_object_p, oasys_slurp_section_data, oasys_write_sections, oasys_write_data, oasys_set_section_contents): .. * opncls.c (get_debug_link_info): .. * osf-core.c (make_bfd_asection): .. * pdp11.c (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, squirt_out_relocs, final_link, aout_link_input_section): .. * peXXigen.c (_bfd_XXi_swap_sym_in, _bfd_XXi_swap_aouthdr_out, pe_print_idata, pe_print_edata, pe_print_pdata, pe_print_reloc): .. * pef.c (bfd_pef_make_bfd_section, bfd_pef_print_loader_section, bfd_pef_scan_start_address, bfd_pef_parse_symbols): .. * ppcboot.c (ppcboot_object_p, ppcboot_canonicalize_symtab): .. * ptrace-core.c (ptrace_unix_core_file_p): .. * reloc.c (bfd_perform_relocation, bfd_install_relocation, _bfd_final_link_relocate, bfd_generic_relax_section, bfd_generic_get_relocated_section_contents): .. * reloc16.c (bfd_coff_reloc16_relax_section, bfd_coff_reloc16_get_relocated_section_c): .. * riscix.c (riscix_some_aout_object_p): .. * rs6000-core.c (read_hdr, make_bfd_asection): .. * sco5-core.c (make_bfd_asection): .. * simple.c (bfd_simple_get_relocated_section_contents): .. * som.c (som_object_setup, setup_sections, som_prep_headers, som_write_fixups, som_begin_writing, bfd_section_from_som_symbol, som_set_reloc_info, som_get_section_contents, som_bfd_link_split_section): .. * sparclinux.c (linux_link_create_dynamic_sections, bfd_sparclinux_size_dynamic_sections, linux_finish_dynamic_link): .. * srec.c (srec_scan, srec_read_section, srec_get_section_contents): .. * stabs.c (_bfd_link_section_stabs, _bfd_discard_section_stabs, _bfd_write_stab_strings, _bfd_stab_section_offset): .. * sunos.c (sunos_read_dynamic_info, sunos_create_dynamic_sections, bfd_sunos_size_dynamic_sections, sunos_scan_std_relocs, sunos_scan_ext_relocs, sunos_scan_dynamic_symbol, sunos_write_dynamic_symbol, sunos_check_dynamic_reloc, sunos_finish_dynamic_link): .. * syms.c (_bfd_stab_section_find_nearest_line): .. * tekhex.c (first_phase, tekhex_set_section_contents, tekhex_write_object_contents): .. * trad-core.c (trad_unix_core_file_p): .. * versados.c (process_esd, process_otr, process_otr): .. * vms-gsd.c (_bfd_vms_slurp_gsd, _bfd_vms_write_gsd): .. * vms-misc.c (add_new_contents): .. * vms-tir.c (check_section, new_section, _bfd_vms_write_tir): .. * vms.c (vms_set_section_contents): .. * xcofflink.c (xcoff_get_section_contents, xcoff_link_add_symbols, xcoff_sweep, bfd_xcoff_size_dynamic_sections, xcoff_build_ldsyms, _bfd_xcoff_bfd_final_link, xcoff_link_input_bfd): .. * xsym.c (bfd_sym_scan): .. See above. binutils/ * objcopy.c (copy_section): Don't set _cooked_size. include/ * bfdlink.h (struct bfd_link_order): Update comment. ld/ * ldlang.c (print_output_section_statement): Don't print size before relaxation. (IGNORE_SECTION): Remove bfd arg. Update all callers. * ldexp.c (fold_name): .. See below. * ldlang.c (section_already_linked, print_output_section_statement, print_input_section, insert_pad, size_input_section, lang_check_section_addresses, lang_size_sections_1, lang_size_sections, lang_do_assignments_1, lang_set_startof, lang_one_common, lang_reset_memory_regions, lang_process, lang_abs_symbol_at_end_of, lang_do_version_exports_section): .. * ldwrite.c (build_link_order, clone_section, ds, split_sections): .. * pe-dll.c (process_def_file, generate_reloc): .. * emultempl/elf32.em (gld${EMULATION_NAME}_find_statement_assignment, gld${EMULATION_NAME}_before_allocation): .. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): .. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_before_allocation, sh64_elf_${EMULATION_NAME}_after_allocation): .. * emultempl/sunos.em (gld${EMULATION_NAME}_before_allocation): .. * emultempl/xtensaelf.em (ld_assign_relative_paged_dot, ld_local_file_relocations_fit, ld_xtensa_insert_page_offsets): Use "size" instead of "_raw_size" and "_cooked_size". Expand bfd_section_size macro invocations.
2004-06-24 12:46:28 +08:00
PRIV (image_section)->size = offset + size;
PRIV (image_ptr) = PRIV (image_section)->contents + offset;
1999-05-03 15:29:11 +08:00
}
return 0;
}
/* Routines to fill sections contents during tir/etir read. */
1999-05-03 15:29:11 +08:00
/* Initialize image buffer pointer to be filled. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_set_ptr (bfd * abfd, int psect, uquad offset)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (4, "image_set_ptr (%d=%s, %d)\n",
psect, PRIV (sections)[psect]->name, offset);
1999-05-03 15:29:11 +08:00
#endif
PRIV (image_ptr) = PRIV (sections)[psect]->contents + offset;
PRIV (image_section) = PRIV (sections)[psect];
1999-05-03 15:29:11 +08:00
}
/* Increment image buffer pointer by offset. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_inc_ptr (bfd * abfd, uquad offset)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (4, "image_inc_ptr (%d)\n", offset);
#endif
PRIV (image_ptr) += offset;
1999-05-03 15:29:11 +08:00
}
/* Dump multiple bytes to section image. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_dump (bfd * abfd,
unsigned char *ptr,
int size,
int offset ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (8, "image_dump from (%p, %d) to (%p)\n", ptr, size,
PRIV (image_ptr));
1999-05-03 15:29:11 +08:00
_bfd_hexdump (9, ptr, size, offset);
#endif
if (PRIV (is_vax) && check_section (abfd, size))
1999-05-03 15:29:11 +08:00
return;
while (size-- > 0)
*PRIV (image_ptr)++ = *ptr++;
1999-05-03 15:29:11 +08:00
}
/* Write byte to section image. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_write_b (bfd * abfd, unsigned int value)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
2005-04-21 15:45:39 +08:00
_bfd_vms_debug (6, "image_write_b (%02x)\n", (int) value);
1999-05-03 15:29:11 +08:00
#endif
if (PRIV (is_vax) && check_section (abfd, 1))
1999-05-03 15:29:11 +08:00
return;
*PRIV (image_ptr)++ = (value & 0xff);
1999-05-03 15:29:11 +08:00
}
/* Write 2-byte word to image. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_write_w (bfd * abfd, unsigned int value)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
2005-04-21 15:45:39 +08:00
_bfd_vms_debug (6, "image_write_w (%04x)\n", (int) value);
1999-05-03 15:29:11 +08:00
#endif
if (PRIV (is_vax) && check_section (abfd, 2))
1999-05-03 15:29:11 +08:00
return;
bfd_putl16 ((bfd_vma) value, PRIV (image_ptr));
PRIV (image_ptr) += 2;
1999-05-03 15:29:11 +08:00
}
/* Write 4-byte long to image. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_write_l (bfd * abfd, unsigned long value)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (6, "image_write_l (%08lx)\n", value);
#endif
if (PRIV (is_vax) && check_section (abfd, 4))
1999-05-03 15:29:11 +08:00
return;
bfd_putl32 ((bfd_vma) value, PRIV (image_ptr));
PRIV (image_ptr) += 4;
1999-05-03 15:29:11 +08:00
}
/* Write 8-byte quad to image. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
image_write_q (bfd * abfd, uquad value)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (6, "image_write_q (%016lx)\n", value);
#endif
if (PRIV (is_vax) && check_section (abfd, 8))
1999-05-03 15:29:11 +08:00
return;
bfd_putl64 (value, PRIV (image_ptr));
PRIV (image_ptr) += 8;
1999-05-03 15:29:11 +08:00
}
static const char *
2005-04-21 15:45:39 +08:00
cmd_name (int cmd)
{
switch (cmd)
{
case ETIR_S_C_STA_GBL: return "ETIR_S_C_STA_GBL";
case ETIR_S_C_STA_PQ: return "ETIR_S_C_STA_PQ";
case ETIR_S_C_STA_LI: return "ETIR_S_C_STA_LI";
case ETIR_S_C_STA_MOD: return "ETIR_S_C_STA_MOD";
case ETIR_S_C_STA_CKARG: return "ETIR_S_C_STA_CKARG";
case ETIR_S_C_STO_B: return "ETIR_S_C_STO_B";
case ETIR_S_C_STO_W: return "ETIR_S_C_STO_W";
case ETIR_S_C_STO_GBL: return "ETIR_S_C_STO_GBL";
case ETIR_S_C_STO_CA: return "ETIR_S_C_STO_CA";
case ETIR_S_C_STO_RB: return "ETIR_S_C_STO_RB";
case ETIR_S_C_STO_AB: return "ETIR_S_C_STO_AB";
case ETIR_S_C_STO_GBL_LW: return "ETIR_S_C_STO_GBL_LW";
case ETIR_S_C_STO_LP_PSB: return "ETIR_S_C_STO_LP_PSB";
case ETIR_S_C_STO_HINT_GBL: return "ETIR_S_C_STO_HINT_GBL";
case ETIR_S_C_STO_HINT_PS: return "ETIR_S_C_STO_HINT_PS";
case ETIR_S_C_OPR_INSV: return "ETIR_S_C_OPR_INSV";
case ETIR_S_C_OPR_USH: return "ETIR_S_C_OPR_USH";
case ETIR_S_C_OPR_ROT: return "ETIR_S_C_OPR_ROT";
case ETIR_S_C_OPR_REDEF: return "ETIR_S_C_OPR_REDEF";
case ETIR_S_C_OPR_DFLIT: return "ETIR_S_C_OPR_DFLIT";
case ETIR_S_C_STC_LP: return "ETIR_S_C_STC_LP";
case ETIR_S_C_STC_GBL: return "ETIR_S_C_STC_GBL";
case ETIR_S_C_STC_GCA: return "ETIR_S_C_STC_GCA";
case ETIR_S_C_STC_PS: return "ETIR_S_C_STC_PS";
case ETIR_S_C_STC_NBH_PS: return "ETIR_S_C_STC_NBH_PS";
case ETIR_S_C_STC_NOP_GBL: return "ETIR_S_C_STC_NOP_GBL";
case ETIR_S_C_STC_NOP_PS: return "ETIR_S_C_STC_NOP_PS";
case ETIR_S_C_STC_BSR_GBL: return "ETIR_S_C_STC_BSR_GBL";
case ETIR_S_C_STC_BSR_PS: return "ETIR_S_C_STC_BSR_PS";
case ETIR_S_C_STC_LDA_GBL: return "ETIR_S_C_STC_LDA_GBL";
case ETIR_S_C_STC_LDA_PS: return "ETIR_S_C_STC_LDA_PS";
case ETIR_S_C_STC_BOH_GBL: return "ETIR_S_C_STC_BOH_GBL";
case ETIR_S_C_STC_BOH_PS: return "ETIR_S_C_STC_BOH_PS";
case ETIR_S_C_STC_NBH_GBL: return "ETIR_S_C_STC_NBH_GBL";
1999-05-03 15:29:11 +08:00
default:
/* These names have not yet been added to this switch statement. */
abort ();
}
}
1999-05-03 15:29:11 +08:00
#define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
/* etir_sta
1999-05-03 15:29:11 +08:00
vms stack commands
1999-05-03 15:29:11 +08:00
handle sta_xxx commands in etir section
ptr points to data area in record
see table B-8 of the openVMS linker manual. */
1999-05-03 15:29:11 +08:00
static bfd_boolean
2005-04-21 15:45:39 +08:00
etir_sta (bfd * abfd, int cmd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_sta %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
switch (cmd)
{
/* stack global
arg: cs symbol name
1999-05-03 15:29:11 +08:00
2005-04-21 15:45:39 +08:00
stack 32 bit value of symbol (high bits set to 0). */
case ETIR_S_C_STA_GBL:
{
char *name;
vms_symbol_entry *entry;
1999-05-03 15:29:11 +08:00
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *)
bfd_hash_lookup (PRIV (vms_symbol_table), name, FALSE, FALSE);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
{
1999-05-03 15:29:11 +08:00
#if VMS_DEBUG
_bfd_vms_debug (3, "%s: no symbol \"%s\"\n",
cmd_name (cmd), name);
1999-05-03 15:29:11 +08:00
#endif
_bfd_vms_push (abfd, (uquad) 0, -1);
}
else
2005-04-21 15:45:39 +08:00
_bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
}
1999-05-03 15:29:11 +08:00
break;
/* stack longword
arg: lw value
1999-05-03 15:29:11 +08:00
2005-04-21 15:45:39 +08:00
stack 32 bit value, sign extend to 64 bit. */
case ETIR_S_C_STA_LW:
_bfd_vms_push (abfd, (uquad) bfd_getl32 (ptr), -1);
1999-05-03 15:29:11 +08:00
break;
/* stack global
arg: qw value
1999-05-03 15:29:11 +08:00
2005-04-21 15:45:39 +08:00
stack 64 bit value of symbol. */
case ETIR_S_C_STA_QW:
_bfd_vms_push (abfd, (uquad) bfd_getl64 (ptr), -1);
1999-05-03 15:29:11 +08:00
break;
/* stack psect base plus quadword offset
arg: lw section index
qw signed quadword offset (low 32 bits)
1999-05-03 15:29:11 +08:00
stack qw argument and section index
2005-04-21 15:45:39 +08:00
(see ETIR_S_C_STO_OFF, ETIR_S_C_CTL_SETRB). */
case ETIR_S_C_STA_PQ:
{
uquad dummy;
unsigned int psect;
1999-05-03 15:29:11 +08:00
psect = bfd_getl32 (ptr);
if (psect >= PRIV (section_count))
{
(*_bfd_error_handler) (_("bad section index in %s"),
cmd_name (cmd));
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
2005-04-21 15:45:39 +08:00
dummy = bfd_getl64 (ptr + 4);
_bfd_vms_push (abfd, dummy, (int) psect);
}
1999-05-03 15:29:11 +08:00
break;
case ETIR_S_C_STA_LI:
case ETIR_S_C_STA_MOD:
case ETIR_S_C_STA_CKARG:
(*_bfd_error_handler) (_("unsupported STA cmd %s"), cmd_name (cmd));
return FALSE;
1999-05-03 15:29:11 +08:00
break;
default:
(*_bfd_error_handler) (_("reserved STA cmd %d"), cmd);
return FALSE;
1999-05-03 15:29:11 +08:00
break;
}
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_sta true\n");
#endif
return TRUE;
1999-05-03 15:29:11 +08:00
}
2005-04-21 15:45:39 +08:00
/* etir_sto
1999-05-03 15:29:11 +08:00
vms store commands
1999-05-03 15:29:11 +08:00
handle sto_xxx commands in etir section
ptr points to data area in record
see table B-9 of the openVMS linker manual. */
1999-05-03 15:29:11 +08:00
static bfd_boolean
2005-04-21 15:45:39 +08:00
etir_sto (bfd * abfd, int cmd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
uquad dummy;
int psect;
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_sto %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
switch (cmd)
{
2005-04-21 15:45:39 +08:00
/* Store byte: pop stack, write byte
arg: -. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_B:
dummy = _bfd_vms_pop (abfd, &psect);
2005-04-21 15:45:39 +08:00
/* FIXME: check top bits. */
image_write_b (abfd, (unsigned int) dummy & 0xff);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
/* Store word: pop stack, write word
arg: -. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_W:
dummy = _bfd_vms_pop (abfd, &psect);
/* FIXME: check top bits */
image_write_w (abfd, (unsigned int) dummy & 0xffff);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
/* Store longword: pop stack, write longword
arg: -. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_LW:
dummy = _bfd_vms_pop (abfd, &psect);
dummy += (PRIV (sections)[psect])->vma;
/* FIXME: check top bits. */
image_write_l (abfd, (unsigned int) dummy & 0xffffffff);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
/* Store quadword: pop stack, write quadword
arg: -. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_QW:
dummy = _bfd_vms_pop (abfd, &psect);
dummy += (PRIV (sections)[psect])->vma;
2005-04-21 15:45:39 +08:00
/* FIXME: check top bits. */
image_write_q (abfd, dummy);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
/* Store immediate repeated: pop stack for repeat count
1999-05-03 15:29:11 +08:00
arg: lw byte count
2005-04-21 15:45:39 +08:00
da data. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_IMMR:
{
int size;
1999-05-03 15:29:11 +08:00
size = bfd_getl32 (ptr);
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (dummy-- > 0)
1999-05-03 15:29:11 +08:00
image_dump (abfd, ptr+4, size, 0);
}
break;
2005-04-21 15:45:39 +08:00
/* Store global: write symbol value
arg: cs global symbol name. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_GBL:
{
vms_symbol_entry *entry;
char *name;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
name, FALSE, FALSE);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
1999-05-03 15:29:11 +08:00
{
(*_bfd_error_handler) (_("%s: no symbol \"%s\""),
cmd_name (cmd), name);
return FALSE;
1999-05-03 15:29:11 +08:00
}
else
/* FIXME, reloc. */
image_write_q (abfd, (uquad) (entry->symbol->value));
1999-05-03 15:29:11 +08:00
}
break;
2005-04-21 15:45:39 +08:00
/* Store code address: write address of entry point
arg: cs global symbol name (procedure). */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_CA:
{
vms_symbol_entry *entry;
char *name;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
name, FALSE, FALSE);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
1999-05-03 15:29:11 +08:00
{
(*_bfd_error_handler) (_("%s: no symbol \"%s\""),
cmd_name (cmd), name);
return FALSE;
1999-05-03 15:29:11 +08:00
}
else
2005-04-21 15:45:39 +08:00
/* FIXME, reloc. */
image_write_q (abfd, (uquad) (entry->symbol->value));
1999-05-03 15:29:11 +08:00
}
break;
/* Store offset to psect: pop stack, add low 32 bits to base of psect
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_OFF:
{
uquad q;
int psect1;
1999-05-03 15:29:11 +08:00
2005-04-21 15:45:39 +08:00
q = _bfd_vms_pop (abfd, & psect1);
q += (PRIV (sections)[psect1])->vma;
1999-05-03 15:29:11 +08:00
image_write_q (abfd, q);
}
break;
/* Store immediate
1999-05-03 15:29:11 +08:00
arg: lw count of bytes
da data. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_IMM:
{
int size;
size = bfd_getl32 (ptr);
image_dump (abfd, ptr+4, size, 0);
}
break;
/* This code is 'reserved to digital' according to the openVMS
linker manual, however it is generated by the DEC C compiler
and defined in the include file.
1999-05-03 15:29:11 +08:00
FIXME, since the following is just a guess
store global longword: store 32bit value of symbol
arg: cs symbol name. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_GBL_LW:
{
vms_symbol_entry *entry;
char *name;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
name, FALSE, FALSE);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (3, "%s: no symbol \"%s\"\n", cmd_name (cmd), name);
1999-05-03 15:29:11 +08:00
#endif
image_write_l (abfd, (unsigned long) 0); /* FIXME, reloc */
1999-05-03 15:29:11 +08:00
}
else
/* FIXME, reloc. */
image_write_l (abfd, (unsigned long) (entry->symbol->value));
1999-05-03 15:29:11 +08:00
}
break;
case ETIR_S_C_STO_RB:
case ETIR_S_C_STO_AB:
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STO_LP_PSB:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
case ETIR_S_C_STO_HINT_GBL:
case ETIR_S_C_STO_HINT_PS:
(*_bfd_error_handler) (_("%s: not implemented"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
default:
(*_bfd_error_handler) (_("reserved STO cmd %d"), cmd);
1999-05-03 15:29:11 +08:00
break;
}
return TRUE;
1999-05-03 15:29:11 +08:00
}
/* Stack operator commands
1999-05-03 15:29:11 +08:00
all 32 bit signed arithmetic
all word just like a stack calculator
arguments are popped from stack, results are pushed on stack
see table B-10 of the openVMS linker manual. */
1999-05-03 15:29:11 +08:00
static bfd_boolean
2005-04-21 15:45:39 +08:00
etir_opr (bfd * abfd, int cmd, unsigned char *ptr ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
long op1, op2;
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_opr %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
switch (cmd)
{
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_NOP: /* No-op. */
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_ADD: /* Add. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 + op2), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_SUB: /* Subtract. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op2 - op1), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_MUL: /* Multiply. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 * op2), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_DIV: /* Divide. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
1999-05-03 15:29:11 +08:00
if (op2 == 0)
_bfd_vms_push (abfd, (uquad) 0, -1);
1999-05-03 15:29:11 +08:00
else
_bfd_vms_push (abfd, (uquad) (op2 / op1), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_AND: /* Logical AND. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 & op2), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_IOR: /* Logical inclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 | op2), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_EOR: /* Logical exclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ op2), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_NEG: /* Negate. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (-op1), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_COM: /* Complement. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ -1L), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_ASH: /* Arithmetic shift. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
2005-04-21 15:45:39 +08:00
if (op2 < 0) /* Shift right. */
1999-05-03 15:29:11 +08:00
op1 >>= -op2;
2005-04-21 15:45:39 +08:00
else /* Shift left. */
1999-05-03 15:29:11 +08:00
op1 <<= op2;
_bfd_vms_push (abfd, (uquad) op1, -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_INSV: /* Insert field. */
(void) _bfd_vms_pop (abfd, NULL);
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_USH: /* Unsigned shift. */
case ETIR_S_C_OPR_ROT: /* Rotate. */
case ETIR_S_C_OPR_REDEF: /* Redefine symbol to current location. */
case ETIR_S_C_OPR_DFLIT: /* Define a literal. */
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case ETIR_S_C_OPR_SEL: /* Select. */
if ((long) _bfd_vms_pop (abfd, NULL) & 0x01L)
(void) _bfd_vms_pop (abfd, NULL);
1999-05-03 15:29:11 +08:00
else
{
op1 = (long) _bfd_vms_pop (abfd, NULL);
(void) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) op1, -1);
1999-05-03 15:29:11 +08:00
}
break;
default:
(*_bfd_error_handler) (_("reserved OPR cmd %d"), cmd);
1999-05-03 15:29:11 +08:00
break;
}
return TRUE;
1999-05-03 15:29:11 +08:00
}
/* Control commands.
See table B-11 of the openVMS linker manual. */
1999-05-03 15:29:11 +08:00
static bfd_boolean
2005-04-21 15:45:39 +08:00
etir_ctl (bfd * abfd, int cmd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
uquad dummy;
int psect;
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_ctl %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
switch (cmd)
{
2005-04-21 15:45:39 +08:00
/* Det relocation base: pop stack, set image location counter
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_CTL_SETRB:
dummy = _bfd_vms_pop (abfd, &psect);
image_set_ptr (abfd, psect, dummy);
break;
2005-04-21 15:45:39 +08:00
/* Augment relocation base: increment image location counter by offset
arg: lw offset value. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_CTL_AUGRB:
dummy = bfd_getl32 (ptr);
image_inc_ptr (abfd, dummy);
break;
2005-04-21 15:45:39 +08:00
/* Define location: pop index, save location counter under index
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_CTL_DFLOC:
dummy = _bfd_vms_pop (abfd, NULL);
/* FIXME */
break;
2005-04-21 15:45:39 +08:00
/* Set location: pop index, restore location counter from index
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_CTL_STLOC:
dummy = _bfd_vms_pop (abfd, &psect);
/* FIXME */
break;
2005-04-21 15:45:39 +08:00
/* Stack defined location: pop index, push location counter from index
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_CTL_STKDL:
dummy = _bfd_vms_pop (abfd, &psect);
2005-04-21 15:45:39 +08:00
/* FIXME. */
1999-05-03 15:29:11 +08:00
break;
default:
(*_bfd_error_handler) (_("reserved CTL cmd %d"), cmd);
1999-05-03 15:29:11 +08:00
break;
}
return TRUE;
1999-05-03 15:29:11 +08:00
}
2005-04-21 15:45:39 +08:00
/* Store conditional commands
See table B-12 and B-13 of the openVMS linker manual. */
1999-05-03 15:29:11 +08:00
static bfd_boolean
2005-04-21 15:45:39 +08:00
etir_stc (bfd * abfd, int cmd, unsigned char *ptr ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_stc %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
switch (cmd)
{
/* 200 Store-conditional Linkage Pair
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_LP:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
/* 201 Store-conditional Linkage Pair with Procedure Signature
arg: lw linkage index
cs procedure name
by signature length
da signature. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_LP_PSB:
image_inc_ptr (abfd, (uquad) 16); /* skip entry,procval */
1999-05-03 15:29:11 +08:00
break;
/* 202 Store-conditional Address at global address
arg: lw linkage index
cs global name. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_GBL:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
/* 203 Store-conditional Code Address at global address
arg: lw linkage index
cs procedure name. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_GCA:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
/* 204 Store-conditional Address at psect + offset
arg: lw linkage index
lw psect index
qw offset. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_PS:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
1999-05-03 15:29:11 +08:00
break;
/* 205 Store-conditional NOP at address of global
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_NOP_GBL:
/* 206 Store-conditional NOP at pect + offset
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_NOP_PS:
/* 207 Store-conditional BSR at global address
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_BSR_GBL:
/* 208 Store-conditional BSR at pect + offset
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_BSR_PS:
/* 209 Store-conditional LDA at global address
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_LDA_GBL:
/* 210 Store-conditional LDA at psect + offset
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_LDA_PS:
/* 211 Store-conditional BSR or Hint at global address
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_BOH_GBL:
/* 212 Store-conditional BSR or Hint at pect + offset
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_BOH_PS:
/* 213 Store-conditional NOP,BSR or HINT at global address
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_NBH_GBL:
/* 214 Store-conditional NOP,BSR or HINT at psect + offset
arg: none. */
1999-05-03 15:29:11 +08:00
case ETIR_S_C_STC_NBH_PS:
/* FIXME */
1999-05-03 15:29:11 +08:00
break;
default:
#if VMS_DEBUG
_bfd_vms_debug (3, "reserved STC cmd %d", cmd);
1999-05-03 15:29:11 +08:00
#endif
break;
}
return TRUE;
1999-05-03 15:29:11 +08:00
}
static asection *
2005-04-21 15:45:39 +08:00
new_section (bfd * abfd ATTRIBUTE_UNUSED, int idx)
1999-05-03 15:29:11 +08:00
{
asection *section;
char sname[16];
char *name;
#if VMS_DEBUG
_bfd_vms_debug (5, "new_section %d\n", idx);
1999-05-03 15:29:11 +08:00
#endif
sprintf (sname, SECTION_NAME_TEMPLATE, idx);
name = bfd_malloc ((bfd_size_type) strlen (sname) + 1);
1999-05-03 15:29:11 +08:00
if (name == 0)
2005-04-21 15:45:39 +08:00
return NULL;
1999-05-03 15:29:11 +08:00
strcpy (name, sname);
section = bfd_malloc ((bfd_size_type) sizeof (asection));
1999-05-03 15:29:11 +08:00
if (section == 0)
{
#if VMS_DEBUG
_bfd_vms_debug (6, "bfd_make_section (%s) failed", name);
#endif
2005-04-21 15:45:39 +08:00
return NULL;
1999-05-03 15:29:11 +08:00
}
bfd/ * section.c (struct sec): Rename "_cooked_size" to "size". Rename "_raw_size" to "rawsize". (STD_SECTION): Adjust comments. (bfd_set_section_size, bfd_get_section_contents): Use size. (bfd_malloc_and_get_section): New function. * bfd-in.h (bfd_section_size, bfd_get_section_size): Use size. * coff-sh.c (sh_relax_section): Alloc coff_section_data struct early. Correctly free reloc and contents memory. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Delete FIXME and fake CIE now that we can shink section size to zero. (_bfd_elf_write_section_eh_frame): Likewise.. * elf32-ppc.c (ppc_elf_relax_section): Delay reading section contents. * elf-m10300.c (mn10300_elf_final_link_relocate): Don't use _bfd_stab_section_offset. Use _bfd_elf_section_offset. * stabs.c (_bfd_stab_section_offset_): Remove unused args and unneeded indirection. * elf.c (_bfd_elf_section_offset): .. and update call. * libbfd-in.h (_bfd_stab_section_offset): Update prototype. * libbfd.h: Regenerate. * bfd-in2.h: Regenerate. Replace occurrences of "_raw_size" and "_cooked_size" in most places with "size". Set new "rawsize" for stabs, eh_frame, and SEC_MERGE sections. Use "rawsize", if non-zero, for bfd_get_section_contents calls if the section might be a stabs, eh_frame, or SEC_MERGE section. Similarly use "rawsize", if non-zero, in reloc functions to validate reloc addresses. Use new bfd_malloc_and_get_section in most places where bfd_get_section_contents was called. Expand all occurrences of bfd_section_size and bfd_get_section_size. Rename "raw_size" var in grok_prstatus and similar functions to "size". * aix386-core.c (aix386_core_file_p): .. * aix5ppc-core.c (xcoff64_core_p): .. * aout-adobe.c (aout_adobe_callback, aout_adobe_write_object_contents, aout_adobe_set_section_contents): .. * aout-target.h (callback): .. * aout-tic30.c (tic30_aout_callback, tic30_aout_final_link_relocate, MY_bfd_final_link): .. * aoutf1.h (sunos4_core_file_p): .. * aoutx.h (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, translate_from_native_sym_flags, final_link, aout_link_input_section): .. * binary.c (binary_object_p, binary_canonicalize_symtab, binary_set_section_contents): .. * bout.c (b_out_callback, b_out_write_object_contents, b_out_set_section_contents, b_out_bfd_relax_section, b_out_bfd_get_relocated_section_contents): .. * cisco-core.c (cisco_core_file_validate): .. * coff-alpha.c (alpha_ecoff_object_p, alpha_ecoff_get_relocated_section_conten, alpha_relocate_section): .. * coff-arm.c (coff_arm_relocate_section, bfd_arm_allocate_interworking_sections): .. * coff-h8300.c (h8300_reloc16_extra_cases, h8300_bfd_link_add_symbols): .. * coff-mips.c (mips_refhi_reloc, mips_gprel_reloc): .. * coff-ppc.c (coff_ppc_relocate_section, ppc_allocate_toc_section, ppc_bfd_coff_final_link): .. * coff-rs6000.c (xcoff_reloc_type_br, xcoff_ppc_relocate_section): .. * coff-sh.c (sh_relax_section, sh_relax_delete_bytes, sh_align_loads, sh_coff_get_relocated_section_contents): .. * coff64-rs6000.c (xcoff64_write_object_contents, xcoff64_reloc_type_br, xcoff64_ppc_relocate_section): .. * coffcode.h (coff_compute_section_file_positions, coff_write_object_contents): .. * coffgen.c (make_a_section_from_file, coff_write_symbols, coff_section_symbol, build_debug_section): .. * cofflink.c (coff_link_add_symbols, _bfd_coff_final_link, process_embedded_commands, _bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): .. * cpu-arm.c (bfd_arm_update_notes, bfd_arm_get_mach_from_notes): .. * cpu-ns32k.c (do_ns32k_reloc, _bfd_ns32k_final_link_relocate): .. * dwarf1.c (parse_line_table, _bfd_dwarf1_find_nearest_line): .. * dwarf2.c (read_indirect_string, read_abbrevs, decode_line_info, _bfd_dwarf2_find_nearest_line): .. * ecoff.c (bfd_debug_section, ecoff_set_symbol_info, ecoff_compute_section_file_positions, _bfd_ecoff_write_object_contents, ecoff_indirect_link_order): .. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame, _bfd_elf_discard_section_eh_frame_hdr, _bfd_elf_maybe_strip_eh_frame_hdr, _bfd_elf_eh_frame_section_offset, _bfd_elf_write_section_eh_frame, _bfd_elf_write_section_eh_frame_hdr): .. * elf-hppa.h (elf_hppa_sort_unwind): .. * elf-m10200.c (mn10200_elf_relax_section, mn10200_elf_relax_delete_bytes, mn10200_elf_get_relocated_section_contents): .. * elf-m10300.c (_bfd_mn10300_elf_create_got_section, mn10300_elf_check_relocs, mn10300_elf_relax_section, mn10300_elf_relax_delete_bytes, mn10300_elf_get_relocated_section_contents, _bfd_mn10300_elf_adjust_dynamic_symbol, _bfd_mn10300_elf_discard_copies, _bfd_mn10300_elf_size_dynamic_sections, _bfd_mn10300_elf_finish_dynamic_sections): .. * elf.c (_bfd_elf_print_private_bfd_data, bfd_elf_get_bfd_needed_list, _bfd_elf_make_section_from_phdr, elf_fake_sections, bfd_elf_set_group_contents, map_sections_to_segments, elf_sort_sections, assign_file_positions_for_segments, SECTION_SIZE, copy_private_bfd_data, _bfd_elf_get_dynamic_reloc_upper_bound, _bfd_elf_canonicalize_dynamic_reloc, elfcore_maybe_make_sect, _bfd_elfcore_make_pseudosection, elfcore_grok_prstatus, elfcore_grok_lwpstatus, elfcore_grok_win32pstatus, elfcore_grok_note, elfcore_grok_nto_status, elfcore_grok_nto_gregs, _bfd_elf_rel_local_sym, _bfd_elf_get_synthetic_symtab): .. * elf32-arm.h (bfd_elf32_arm_allocate_interworking_sect, bfd_elf32_arm_process_before_allocation, elf32_arm_adjust_dynamic_symbol, allocate_dynrelocs, elf32_arm_size_dynamic_sections, elf32_arm_finish_dynamic_sections, elf32_arm_write_section): .. * elf32-cris.c (cris_elf_grok_prstatus, elf_cris_finish_dynamic_sections, cris_elf_gc_sweep_hook, elf_cris_adjust_gotplt_to_got, elf_cris_adjust_dynamic_symbol, cris_elf_check_relocs, elf_cris_size_dynamic_sections, elf_cris_discard_excess_dso_dynamics, elf_cris_discard_excess_program_dynamics): .. * elf32-d30v.c (bfd_elf_d30v_reloc, bfd_elf_d30v_reloc_21): .. * elf32-dlx.c (_bfd_dlx_elf_hi16_reloc): .. * elf32-frv.c (_frvfdpic_add_dyn_reloc, _frvfdpic_add_rofixup, _frv_create_got_section, _frvfdpic_assign_plt_entries, elf32_frvfdpic_size_dynamic_sections, elf32_frvfdpic_modify_segment_map, elf32_frvfdpic_finish_dynamic_sections): .. * elf32-h8300.c (elf32_h8_relax_section, elf32_h8_relax_delete_bytes, elf32_h8_get_relocated_section_contents): .. * elf32-hppa.c (hppa_build_one_stub, hppa_size_one_stub, elf32_hppa_adjust_dynamic_symbol, allocate_plt_static, allocate_dynrelocs, elf32_hppa_size_dynamic_sections, group_sections, elf32_hppa_size_stubs, elf32_hppa_set_gp, elf32_hppa_build_stubs, elf32_hppa_finish_dynamic_sections): .. * elf32-i370.c (i370_elf_adjust_dynamic_symbol, i370_elf_size_dynamic_sections, i370_elf_check_relocs, i370_elf_finish_dynamic_sections): .. * elf32-i386.c (elf_i386_grok_prstatus, elf_i386_adjust_dynamic_symbol, allocate_dynrelocs, elf_i386_size_dynamic_sections, elf_i386_relocate_section, elf_i386_finish_dynamic_sections): .. * elf32-i860.c (i860_howto_pc26_reloc, i860_howto_pc16_reloc, i860_howto_highadj_reloc, i860_howto_splitn_reloc): .. * elf32-ip2k.c (ip2k_is_switch_table_128, ip2k_relax_switch_table_128, ip2k_is_switch_table_256, ip2k_relax_switch_table_256, ip2k_elf_relax_section, adjust_all_relocations, ip2k_elf_relax_delete_bytes): .. * elf32-m32r.c (m32r_elf_do_10_pcrel_reloc, m32r_elf_hi16_reloc, m32r_elf_generic_reloc, m32r_elf_adjust_dynamic_symbol, allocate_dynrelocs, m32r_elf_size_dynamic_sections, m32r_elf_relocate_section, m32r_elf_finish_dynamic_sections, m32r_elf_relax_section, m32r_elf_relax_delete_bytes, m32r_elf_get_relocated_section_contents): .. * elf32-m68hc11.c (m68hc11_elf_build_one_stub, m68hc11_elf_size_one_stub, m68hc11_elf_relax_section, m68hc11_elf_relax_delete_bytes): .. * elf32-m68hc12.c (m68hc12_elf_build_one_stub, m68hc12_elf_size_one_stub): .. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs, elf32_m68hc11_build_stubs, m68hc11_elf_special_reloc): .. * elf32-m68k.c (elf_m68k_check_relocs, elf_m68k_gc_sweep_hook, elf_m68k_adjust_dynamic_symbol, elf_m68k_size_dynamic_sections, elf_m68k_discard_copies, elf_m68k_finish_dynamic_sections): .. * elf32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elf32-or32.c (or32_elf_consth_reloc): .. * elf32-ppc.c (ppc_elf_relax_section, ppc_elf_addr16_ha_reloc, elf_create_pointer_linker_section, ppc_elf_create_linker_section, ppc_elf_additional_program_headers, ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs, ppc_elf_size_dynamic_sections, ppc_elf_finish_dynamic_sections, ppc_elf_grok_prstatus, ppc_elf_final_write_processing): .. * elf32-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections, elf_s390_grok_prstatus): .. * elf32-sh.c (sh_elf_reloc_loop, sh_elf_relax_section, sh_elf_relax_delete_bytes, sh_elf_align_loads, sh_elf_adjust_dynamic_symbol, allocate_dynrelocs, sh_elf_size_dynamic_sections, sh_elf_get_relocated_section_contents, sh_elf_finish_dynamic_sections, elf32_shlin_grok_prstatus): .. * elf32-sh64-com.c (sh64_address_in_cranges, sh64_get_contents_type): .. * elf32-sh64.c (sh64_find_section_for_address, sh64_elf_final_write_processing): .. * elf32-sparc.c (sparc_elf_wdisp16_reloc, sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_adjust_dynamic_symbol, allocate_dynrelocs, elf32_sparc_size_dynamic_sections, elf32_sparc_relocate_section, elf32_sparc_finish_dynamic_sections): .. * elf32-v850.c (v850_elf_reloc, v850_elf_relax_section): .. * elf32-vax.c (elf_vax_check_relocs, elf_vax_adjust_dynamic_symbol, elf_vax_size_dynamic_sections, elf_vax_discard_copies, elf_vax_instantiate_got_entries, elf_vax_relocate_section, elf_vax_finish_dynamic_sections): .. * elf32-xstormy16.c (xstormy16_elf_24_reloc, xstormy16_elf_check_relocs, xstormy16_relax_plt_check, xstormy16_elf_relax_section, xstormy16_elf_always_size_sections, xstormy16_elf_finish_dynamic_sections): .. * elf32-xtensa.c (xtensa_read_table_entries, elf_xtensa_allocate_got_size, elf_xtensa_allocate_local_got_size, elf_xtensa_size_dynamic_sections, elf_xtensa_do_reloc, bfd_elf_xtensa_reloc, elf_xtensa_relocate_section, elf_xtensa_combine_prop_entries, elf_xtensa_finish_dynamic_sections, elf_xtensa_discard_info_for_section, elf_xtensa_grok_prstatus, get_relocation_opcode, retrieve_contents, find_relaxable_sections, collect_source_relocs, is_resolvable_asm_expansion, remove_literals, relax_section, shrink_dynamic_reloc_sections, relax_property_section, xtensa_callback_required_dependence): .. * elf64-alpha.c (elf64_alpha_reloc_gpdisp, elf64_alpha_relax_section, elf64_alpha_check_relocs, elf64_alpha_adjust_dynamic_symbol, elf64_alpha_calc_got_offsets_for_symbol, elf64_alpha_calc_got_offsets, elf64_alpha_size_plt_section, elf64_alpha_size_plt_section_1, elf64_alpha_always_size_sections, elf64_alpha_calc_dynrel_sizes, elf64_alpha_size_rela_got_section, elf64_alpha_size_rela_got_1, elf64_alpha_size_dynamic_sections, elf64_alpha_emit_dynrel, elf64_alpha_finish_dynamic_sections, elf64_alpha_final_link): .. * elf64-hppa.c (allocate_dynrel_entries, elf64_hppa_size_dynamic_sections, elf64_hppa_finish_dynamic_sections): .. * elf64-mips.c (mips_elf64_gprel32_reloc, mips16_gprel_reloc, mips_elf64_canonicalize_dynamic_reloc, mips_elf64_slurp_reloc_table, elf64_mips_grok_prstatus): .. * elf64-mmix.c (mmix_elf_perform_relocation, mmix_elf_reloc, mmix_elf_relocate_section, mmix_elf_final_link, mmix_set_relaxable_size, _bfd_mmix_after_linker_allocation, mmix_elf_relax_section, mmix_elf_get_section_contents): .. * elf64-ppc.c (ppc64_elf_object_p, ppc64_elf_grok_prstatus, ppc64_elf_check_relocs, ppc64_elf_func_desc_adjust, ppc64_elf_adjust_dynamic_symbol, ppc64_elf_edit_opd, allocate_dynrelocs, ppc64_elf_size_dynamic_sections, ppc_build_one_stub, ppc_size_one_stub, ppc64_elf_next_toc_section, toc_adjusting_stub_needed, group_sections, ppc64_elf_size_stubs, ppc64_elf_build_stubs, ppc64_elf_relocate_section, ppc64_elf_finish_dynamic_sections): .. * elf64-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections): .. * elf64-sh64.c (sh_elf64_get_relocated_section_contents, sh_elf64_check_relocs, sh64_elf64_adjust_dynamic_symbol, sh64_elf64_discard_copies, sh64_elf64_size_dynamic_sections, sh64_elf64_finish_dynamic_sections): .. * elf64-sparc.c (sparc64_elf_slurp_reloc_table, init_insn_reloc, sparc64_elf_check_relocs, sparc64_elf_adjust_dynamic_symbol, sparc64_elf_size_dynamic_sections, sparc64_elf_relocate_section, sparc64_elf_finish_dynamic_symbol, sparc64_elf_finish_dynamic_sections): .. * elf64-x86-64.c (elf64_x86_64_grok_prstatus, elf64_x86_64_adjust_dynamic_symbol, allocate_dynrelocs, elf64_x86_64_size_dynamic_sections, elf64_x86_64_relocate_section, elf64_x86_64_finish_dynamic_sections): .. * elfarm-nabi.c (elf32_arm_nabi_grok_prstatus): .. * elfcode.h (elf_slurp_reloc_table): .. * elflink.c (_bfd_elf_create_got_section, elf_add_dt_needed_tag, elf_finalize_dynstr, elf_link_add_object_symbols, bfd_elf_size_dynamic_sections, elf_link_sort_relocs, elf_link_input_bfd, bfd_elf_final_link, bfd_elf_discard_info): .. * elfn32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elfxx-ia64.c (elfNN_ia64_relax_section, allocate_dynrel_entries, elfNN_ia64_size_dynamic_sections, elfNN_ia64_install_dyn_reloc, elfNN_ia64_choose_gp, elfNN_ia64_final_link, elfNN_ia64_finish_dynamic_sections): .. * elfxx-mips.c (mips_elf_create_procedure_table, mips_elf_check_mips16_stubs, _bfd_mips_elf_gprel16_with_gp, _bfd_mips_elf_hi16_reloc, _bfd_mips_elf_generic_reloc, mips_elf_global_got_index, mips_elf_multi_got, mips_elf_create_compact_rel_section, mips_elf_calculate_relocation, mips_elf_allocate_dynamic_relocations, mips_elf_create_dynamic_relocation, _bfd_mips_elf_fake_sections, _bfd_mips_relax_section, _bfd_mips_elf_adjust_dynamic_symbol, _bfd_mips_elf_always_size_sections, _bfd_mips_elf_size_dynamic_sections, _bfd_mips_elf_finish_dynamic_symbol, _bfd_mips_elf_finish_dynamic_sections, _bfd_mips_elf_modify_segment_map, _bfd_mips_elf_discard_info, _bfd_mips_elf_write_section, _bfd_mips_elf_set_section_contents, _bfd_elf_mips_get_relocated_section_contents, _bfd_mips_elf_final_link, _bfd_mips_elf_merge_private_bfd_data): .. * hp300hpux.c (callback): .. * hppabsd-core.c (make_bfd_asection): .. * hpux-core.c (make_bfd_asection): .. * i386linux.c (linux_link_create_dynamic_sections, bfd_i386linux_size_dynamic_sections, linux_finish_dynamic_link): .. * i386msdos.c (msdos_write_object_contents): .. * i386os9k.c (os9k_callback, os9k_write_object_contents, os9k_set_section_contents): .. * ieee.c (parse_expression, ieee_slurp_external_symbols, ieee_slurp_sections, ieee_slurp_debug, ieee_slurp_section_data, ieee_write_section_part, do_with_relocs, do_as_repeat, do_without_relocs, ieee_write_debug_part, init_for_output, ieee_set_section_contents): .. * ihex.c (ihex_scan, ihex_read_section, ihex_get_section_contents): .. * irix-core.c (do_sections, make_bfd_asection): .. * libaout.h (aout_section_merge_with_text_p): .. * libbfd.c (_bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window): .. * linker.c (default_indirect_link_order): .. * lynx-core.c (make_bfd_asection): .. * m68klinux.c (linux_link_create_dynamic_sections, bfd_m68klinux_size_dynamic_sections, linux_finish_dynamic_link): .. * mach-o.c (bfd_mach_o_make_bfd_section, bfd_mach_o_scan_read_dylinker, bfd_mach_o_scan_read_dylib, bfd_mach_o_scan_read_thread, bfd_mach_o_scan_read_symtab, bfd_mach_o_scan_read_segment): .. * merge.c (_bfd_add_merge_section, record_section, merge_strings, _bfd_merge_sections): .. * mmo.c (mmo_find_sec_w_addr, mmo_get_spec_section, mmo_get_loc, mmo_map_set_sizes, mmo_canonicalize_symtab, mmo_internal_write_section, mmo_write_object_contents): .. * netbsd-core.c (netbsd_core_file_p): .. * nlm32-alpha.c (nlm_alpha_read_reloc, nlm_alpha_write_import, nlm_alpha_set_public_section): .. * nlm32-ppc.c (nlm_powerpc_read_reloc, nlm_powerpc_write_reloc): .. * nlm32-sparc.c (nlm_sparc_write_import): .. * nlmcode.h (add_bfd_section, nlm_swap_auxiliary_headers_in, nlm_compute_section_file_positions): .. * oasys.c (oasys_object_p, oasys_slurp_section_data, oasys_write_sections, oasys_write_data, oasys_set_section_contents): .. * opncls.c (get_debug_link_info): .. * osf-core.c (make_bfd_asection): .. * pdp11.c (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, squirt_out_relocs, final_link, aout_link_input_section): .. * peXXigen.c (_bfd_XXi_swap_sym_in, _bfd_XXi_swap_aouthdr_out, pe_print_idata, pe_print_edata, pe_print_pdata, pe_print_reloc): .. * pef.c (bfd_pef_make_bfd_section, bfd_pef_print_loader_section, bfd_pef_scan_start_address, bfd_pef_parse_symbols): .. * ppcboot.c (ppcboot_object_p, ppcboot_canonicalize_symtab): .. * ptrace-core.c (ptrace_unix_core_file_p): .. * reloc.c (bfd_perform_relocation, bfd_install_relocation, _bfd_final_link_relocate, bfd_generic_relax_section, bfd_generic_get_relocated_section_contents): .. * reloc16.c (bfd_coff_reloc16_relax_section, bfd_coff_reloc16_get_relocated_section_c): .. * riscix.c (riscix_some_aout_object_p): .. * rs6000-core.c (read_hdr, make_bfd_asection): .. * sco5-core.c (make_bfd_asection): .. * simple.c (bfd_simple_get_relocated_section_contents): .. * som.c (som_object_setup, setup_sections, som_prep_headers, som_write_fixups, som_begin_writing, bfd_section_from_som_symbol, som_set_reloc_info, som_get_section_contents, som_bfd_link_split_section): .. * sparclinux.c (linux_link_create_dynamic_sections, bfd_sparclinux_size_dynamic_sections, linux_finish_dynamic_link): .. * srec.c (srec_scan, srec_read_section, srec_get_section_contents): .. * stabs.c (_bfd_link_section_stabs, _bfd_discard_section_stabs, _bfd_write_stab_strings, _bfd_stab_section_offset): .. * sunos.c (sunos_read_dynamic_info, sunos_create_dynamic_sections, bfd_sunos_size_dynamic_sections, sunos_scan_std_relocs, sunos_scan_ext_relocs, sunos_scan_dynamic_symbol, sunos_write_dynamic_symbol, sunos_check_dynamic_reloc, sunos_finish_dynamic_link): .. * syms.c (_bfd_stab_section_find_nearest_line): .. * tekhex.c (first_phase, tekhex_set_section_contents, tekhex_write_object_contents): .. * trad-core.c (trad_unix_core_file_p): .. * versados.c (process_esd, process_otr, process_otr): .. * vms-gsd.c (_bfd_vms_slurp_gsd, _bfd_vms_write_gsd): .. * vms-misc.c (add_new_contents): .. * vms-tir.c (check_section, new_section, _bfd_vms_write_tir): .. * vms.c (vms_set_section_contents): .. * xcofflink.c (xcoff_get_section_contents, xcoff_link_add_symbols, xcoff_sweep, bfd_xcoff_size_dynamic_sections, xcoff_build_ldsyms, _bfd_xcoff_bfd_final_link, xcoff_link_input_bfd): .. * xsym.c (bfd_sym_scan): .. See above. binutils/ * objcopy.c (copy_section): Don't set _cooked_size. include/ * bfdlink.h (struct bfd_link_order): Update comment. ld/ * ldlang.c (print_output_section_statement): Don't print size before relaxation. (IGNORE_SECTION): Remove bfd arg. Update all callers. * ldexp.c (fold_name): .. See below. * ldlang.c (section_already_linked, print_output_section_statement, print_input_section, insert_pad, size_input_section, lang_check_section_addresses, lang_size_sections_1, lang_size_sections, lang_do_assignments_1, lang_set_startof, lang_one_common, lang_reset_memory_regions, lang_process, lang_abs_symbol_at_end_of, lang_do_version_exports_section): .. * ldwrite.c (build_link_order, clone_section, ds, split_sections): .. * pe-dll.c (process_def_file, generate_reloc): .. * emultempl/elf32.em (gld${EMULATION_NAME}_find_statement_assignment, gld${EMULATION_NAME}_before_allocation): .. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): .. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_before_allocation, sh64_elf_${EMULATION_NAME}_after_allocation): .. * emultempl/sunos.em (gld${EMULATION_NAME}_before_allocation): .. * emultempl/xtensaelf.em (ld_assign_relative_paged_dot, ld_local_file_relocations_fit, ld_xtensa_insert_page_offsets): Use "size" instead of "_raw_size" and "_cooked_size". Expand bfd_section_size macro invocations.
2004-06-24 12:46:28 +08:00
section->size = 0;
1999-05-03 15:29:11 +08:00
section->vma = 0;
section->contents = 0;
section->name = name;
section->index = idx;
return section;
}
static int
2005-04-21 15:45:39 +08:00
alloc_section (bfd * abfd, unsigned int idx)
1999-05-03 15:29:11 +08:00
{
bfd_size_type amt;
1999-05-03 15:29:11 +08:00
#if VMS_DEBUG
_bfd_vms_debug (4, "alloc_section %d\n", idx);
1999-05-03 15:29:11 +08:00
#endif
amt = idx + 1;
amt *= sizeof (asection *);
2005-04-21 15:45:39 +08:00
PRIV (sections) = bfd_realloc (PRIV (sections), amt);
if (PRIV (sections) == 0)
1999-05-03 15:29:11 +08:00
return -1;
while (PRIV (section_count) <= idx)
1999-05-03 15:29:11 +08:00
{
PRIV (sections)[PRIV (section_count)]
= new_section (abfd, (int) PRIV (section_count));
if (PRIV (sections)[PRIV (section_count)] == 0)
1999-05-03 15:29:11 +08:00
return -1;
PRIV (section_count)++;
1999-05-03 15:29:11 +08:00
}
return 0;
}
/* tir_sta
vax stack commands
Handle sta_xxx commands in tir section
ptr points to data area in record
See table 7-3 of the VAX/VMS linker manual. */
1999-05-03 15:29:11 +08:00
static unsigned char *
2005-04-21 15:45:39 +08:00
tir_sta (bfd * abfd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
int cmd = *ptr++;
#if VMS_DEBUG
_bfd_vms_debug (5, "tir_sta %d\n", cmd);
#endif
switch (cmd)
{
/* stack */
case TIR_S_C_STA_GBL:
/* stack global
arg: cs symbol name
stack 32 bit value of symbol (high bits set to 0). */
{
char *name;
vms_symbol_entry *entry;
1999-05-03 15:29:11 +08:00
name = _bfd_vms_save_counted_string (ptr);
1999-05-03 15:29:11 +08:00
entry = _bfd_vms_enter_symbol (abfd, name);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
return NULL;
1999-05-03 15:29:11 +08:00
_bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
ptr += *ptr + 1;
}
1999-05-03 15:29:11 +08:00
break;
case TIR_S_C_STA_SB:
/* stack signed byte
arg: by value
stack byte value, sign extend to 32 bit. */
_bfd_vms_push (abfd, (uquad) *ptr++, -1);
break;
case TIR_S_C_STA_SW:
/* stack signed short word
arg: sh value
stack 16 bit value, sign extend to 32 bit. */
_bfd_vms_push (abfd, (uquad) bfd_getl16 (ptr), -1);
ptr += 2;
break;
case TIR_S_C_STA_LW:
/* stack signed longword
arg: lw value
stack 32 bit value. */
_bfd_vms_push (abfd, (uquad) bfd_getl32 (ptr), -1);
ptr += 4;
break;
case TIR_S_C_STA_PB:
case TIR_S_C_STA_WPB:
/* stack psect base plus byte offset (word index)
arg: by section index
(sh section index)
by signed byte offset. */
{
unsigned long dummy;
unsigned int psect;
if (cmd == TIR_S_C_STA_PB)
psect = *ptr++;
else
{
psect = bfd_getl16 (ptr);
ptr += 2;
}
if (psect >= PRIV (section_count))
alloc_section (abfd, psect);
dummy = (long) *ptr++;
dummy += (PRIV (sections)[psect])->vma;
_bfd_vms_push (abfd, (uquad) dummy, (int) psect);
}
1999-05-03 15:29:11 +08:00
break;
case TIR_S_C_STA_PW:
case TIR_S_C_STA_WPW:
/* stack psect base plus word offset (word index)
arg: by section index
(sh section index)
sh signed short offset. */
{
unsigned long dummy;
unsigned int psect;
1999-05-03 15:29:11 +08:00
if (cmd == TIR_S_C_STA_PW)
psect = *ptr++;
else
{
psect = bfd_getl16 (ptr);
ptr += 2;
}
1999-05-03 15:29:11 +08:00
if (psect >= PRIV (section_count))
alloc_section (abfd, psect);
1999-05-03 15:29:11 +08:00
dummy = bfd_getl16 (ptr); ptr+=2;
dummy += (PRIV (sections)[psect])->vma;
_bfd_vms_push (abfd, (uquad) dummy, (int) psect);
}
break;
1999-05-03 15:29:11 +08:00
case TIR_S_C_STA_PL:
case TIR_S_C_STA_WPL:
/* stack psect base plus long offset (word index)
arg: by section index
(sh section index)
lw signed longword offset. */
{
unsigned long dummy;
unsigned int psect;
1999-05-03 15:29:11 +08:00
if (cmd == TIR_S_C_STA_PL)
psect = *ptr++;
else
{
psect = bfd_getl16 (ptr);
ptr += 2;
}
1999-05-03 15:29:11 +08:00
if (psect >= PRIV (section_count))
alloc_section (abfd, psect);
dummy = bfd_getl32 (ptr); ptr += 4;
dummy += (PRIV (sections)[psect])->vma;
_bfd_vms_push (abfd, (uquad) dummy, (int) psect);
}
1999-05-03 15:29:11 +08:00
break;
case TIR_S_C_STA_UB:
/* stack unsigned byte
arg: by value
stack byte value. */
_bfd_vms_push (abfd, (uquad) *ptr++, -1);
break;
case TIR_S_C_STA_UW:
/* stack unsigned short word
arg: sh value
stack 16 bit value. */
_bfd_vms_push (abfd, (uquad) bfd_getl16 (ptr), -1);
ptr += 2;
break;
case TIR_S_C_STA_BFI:
/* stack byte from image
arg: none. */
/* FALLTHRU */
case TIR_S_C_STA_WFI:
/* stack byte from image
arg: none. */
/* FALLTHRU */
case TIR_S_C_STA_LFI:
/* stack byte from image
arg: none. */
(*_bfd_error_handler) (_("stack-from-image not implemented"));
return NULL;
case TIR_S_C_STA_EPM:
/* stack entry point mask
arg: cs symbol name
stack (unsigned) entry point mask of symbol
err if symbol is no entry point. */
{
char *name;
vms_symbol_entry *entry;
1999-05-03 15:29:11 +08:00
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
return NULL;
1999-05-03 15:29:11 +08:00
(*_bfd_error_handler) (_("stack-entry-mask not fully implemented"));
_bfd_vms_push (abfd, (uquad) 0, -1);
ptr += *ptr + 1;
}
1999-05-03 15:29:11 +08:00
break;
case TIR_S_C_STA_CKARG:
/* compare procedure argument
arg: cs symbol name
by argument index
da argument descriptor
compare argument descriptor with symbol argument (ARG$V_PASSMECH)
and stack TRUE (args match) or FALSE (args dont match) value. */
(*_bfd_error_handler) (_("PASSMECH not fully implemented"));
_bfd_vms_push (abfd, (uquad) 1, -1);
break;
case TIR_S_C_STA_LSY:
/* stack local symbol value
arg: sh environment index
cs symbol name. */
{
int envidx;
char *name;
vms_symbol_entry *entry;
1999-05-03 15:29:11 +08:00
envidx = bfd_getl16 (ptr);
ptr += 2;
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
return NULL;
(*_bfd_error_handler) (_("stack-local-symbol not fully implemented"));
_bfd_vms_push (abfd, (uquad) 0, -1);
ptr += *ptr + 1;
}
1999-05-03 15:29:11 +08:00
break;
case TIR_S_C_STA_LIT:
/* stack literal
arg: by literal index
stack literal. */
ptr++;
_bfd_vms_push (abfd, (uquad) 0, -1);
(*_bfd_error_handler) (_("stack-literal not fully implemented"));
break;
case TIR_S_C_STA_LEPM:
/* stack local symbol entry point mask
arg: sh environment index
cs symbol name
stack (unsigned) entry point mask of symbol
err if symbol is no entry point. */
{
int envidx;
char *name;
vms_symbol_entry *entry;
1999-05-03 15:29:11 +08:00
envidx = bfd_getl16 (ptr);
ptr += 2;
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
2005-04-21 15:45:39 +08:00
if (entry == NULL)
return NULL;
(*_bfd_error_handler) (_("stack-local-symbol-entry-point-mask not fully implemented"));
_bfd_vms_push (abfd, (uquad) 0, -1);
ptr += *ptr + 1;
}
1999-05-03 15:29:11 +08:00
break;
default:
(*_bfd_error_handler) (_("reserved STA cmd %d"), ptr[-1]);
return NULL;
1999-05-03 15:29:11 +08:00
break;
}
1999-05-03 15:29:11 +08:00
return ptr;
}
static const char *
2005-04-21 15:45:39 +08:00
tir_cmd_name (int cmd)
{
switch (cmd)
{
case TIR_S_C_STO_RSB: return "TIR_S_C_STO_RSB";
case TIR_S_C_STO_RSW: return "TIR_S_C_STO_RSW";
case TIR_S_C_STO_RL: return "TIR_S_C_STO_RL";
case TIR_S_C_STO_VPS: return "TIR_S_C_STO_VPS";
case TIR_S_C_STO_USB: return "TIR_S_C_STO_USB";
case TIR_S_C_STO_USW: return "TIR_S_C_STO_USW";
case TIR_S_C_STO_RUB: return "TIR_S_C_STO_RUB";
case TIR_S_C_STO_RUW: return "TIR_S_C_STO_RUW";
case TIR_S_C_STO_PIRR: return "TIR_S_C_STO_PIRR";
case TIR_S_C_OPR_INSV: return "TIR_S_C_OPR_INSV";
case TIR_S_C_OPR_DFLIT: return "TIR_S_C_OPR_DFLIT";
case TIR_S_C_OPR_REDEF: return "TIR_S_C_OPR_REDEF";
case TIR_S_C_OPR_ROT: return "TIR_S_C_OPR_ROT";
case TIR_S_C_OPR_USH: return "TIR_S_C_OPR_USH";
case TIR_S_C_OPR_ASH: return "TIR_S_C_OPR_ASH";
case TIR_S_C_CTL_DFLOC: return "TIR_S_C_CTL_DFLOC";
case TIR_S_C_CTL_STLOC: return "TIR_S_C_CTL_STLOC";
case TIR_S_C_CTL_STKDL: return "TIR_S_C_CTL_STKDL";
default:
/* These strings have not been added yet. */
abort ();
}
}
/* tir_sto
vax store commands
handle sto_xxx commands in tir section
ptr points to data area in record
See table 7-4 of the VAX/VMS linker manual. */
1999-05-03 15:29:11 +08:00
static unsigned char *
2005-04-21 15:45:39 +08:00
tir_sto (bfd * abfd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
unsigned long dummy;
int size;
int psect;
#if VMS_DEBUG
_bfd_vms_debug (5, "tir_sto %d\n", *ptr);
#endif
switch (*ptr++)
{
case TIR_S_C_STO_SB:
2005-04-21 15:45:39 +08:00
/* Store signed byte: pop stack, write byte
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_b (abfd, dummy & 0xff); /* FIXME: check top bits */
break;
case TIR_S_C_STO_SW:
2005-04-21 15:45:39 +08:00
/* Store signed word: pop stack, write word
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_w (abfd, dummy & 0xffff); /* FIXME: check top bits */
break;
case TIR_S_C_STO_LW:
2005-04-21 15:45:39 +08:00
/* Store longword: pop stack, write longword
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_l (abfd, dummy & 0xffffffff); /* FIXME: check top bits */
break;
case TIR_S_C_STO_BD:
2005-04-21 15:45:39 +08:00
/* Store byte displaced: pop stack, sub lc+1, write byte
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
dummy -= ((PRIV (sections)[psect])->vma + 1);
image_write_b (abfd, dummy & 0xff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_WD:
2005-04-21 15:45:39 +08:00
/* Store word displaced: pop stack, sub lc+2, write word
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
dummy -= ((PRIV (sections)[psect])->vma + 2);
image_write_w (abfd, dummy & 0xffff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_LD:
2005-04-21 15:45:39 +08:00
/* Store long displaced: pop stack, sub lc+4, write long
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
dummy -= ((PRIV (sections)[psect])->vma + 4);
image_write_l (abfd, dummy & 0xffffffff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_LI:
2005-04-21 15:45:39 +08:00
/* Store short literal: pop stack, write byte
arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_b (abfd, dummy & 0xff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_PIDR:
2005-04-21 15:45:39 +08:00
/* Store position independent data reference: pop stack, write longword
arg: none.
FIXME: incomplete ! */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_l (abfd, dummy & 0xffffffff);
break;
case TIR_S_C_STO_PICR:
2005-04-21 15:45:39 +08:00
/* Store position independent code reference: pop stack, write longword
arg: none.
FIXME: incomplete ! */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_b (abfd, 0x9f);
image_write_l (abfd, dummy & 0xffffffff);
break;
case TIR_S_C_STO_RIVB:
2005-04-21 15:45:39 +08:00
/* Store repeated immediate variable bytes
1-byte count n field followed by n bytes of data
pop stack, write n bytes <stack> times. */
size = *ptr++;
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (dummy-- > 0L)
image_dump (abfd, ptr, size, 0);
ptr += size;
break;
case TIR_S_C_STO_B:
2005-04-21 15:45:39 +08:00
/* Store byte from top longword. */
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
image_write_b (abfd, dummy & 0xff);
break;
case TIR_S_C_STO_W:
2005-04-21 15:45:39 +08:00
/* Store word from top longword. */
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
image_write_w (abfd, dummy & 0xffff);
break;
case TIR_S_C_STO_RB:
2005-04-21 15:45:39 +08:00
/* Store repeated byte from top longword. */
size = (unsigned long) _bfd_vms_pop (abfd, NULL);
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (size-- > 0)
1999-05-03 15:29:11 +08:00
image_write_b (abfd, dummy & 0xff);
break;
case TIR_S_C_STO_RW:
2005-04-21 15:45:39 +08:00
/* Store repeated word from top longword. */
size = (unsigned long) _bfd_vms_pop (abfd, NULL);
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (size-- > 0)
1999-05-03 15:29:11 +08:00
image_write_w (abfd, dummy & 0xffff);
break;
1999-05-03 15:29:11 +08:00
case TIR_S_C_STO_RSB:
case TIR_S_C_STO_RSW:
case TIR_S_C_STO_RL:
case TIR_S_C_STO_VPS:
case TIR_S_C_STO_USB:
case TIR_S_C_STO_USW:
case TIR_S_C_STO_RUB:
case TIR_S_C_STO_RUW:
case TIR_S_C_STO_PIRR:
(*_bfd_error_handler) (_("%s: not implemented"), tir_cmd_name (ptr[-1]));
1999-05-03 15:29:11 +08:00
break;
default:
(*_bfd_error_handler) (_("reserved STO cmd %d"), ptr[-1]);
1999-05-03 15:29:11 +08:00
break;
}
1999-05-03 15:29:11 +08:00
return ptr;
}
2005-04-21 15:45:39 +08:00
/* Stack operator commands
All 32 bit signed arithmetic
All word just like a stack calculator
Arguments are popped from stack, results are pushed on stack
See table 7-5 of the VAX/VMS linker manual. */
1999-05-03 15:29:11 +08:00
static unsigned char *
2005-04-21 15:45:39 +08:00
tir_opr (bfd * abfd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
long op1, op2;
#if VMS_DEBUG
_bfd_vms_debug (5, "tir_opr %d\n", *ptr);
#endif
2005-04-21 15:45:39 +08:00
/* Operation. */
1999-05-03 15:29:11 +08:00
switch (*ptr++)
{
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_NOP: /* No-op. */
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_ADD: /* Add. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 + op2), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_SUB: /* Subtract. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op2 - op1), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_MUL: /* Multiply. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 * op2), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_DIV: /* Divide. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
if (op2 == 0)
_bfd_vms_push (abfd, (uquad) 0, -1);
else
_bfd_vms_push (abfd, (uquad) (op2 / op1), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_AND: /* Logical AND. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 & op2), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_IOR: /* Logical inclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 | op2), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_EOR: /* Logical exclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ op2), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_NEG: /* Negate. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (-op1), -1);
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_COM: /* Complement. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ -1L), -1);
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_INSV: /* Insert field. */
(void) _bfd_vms_pop (abfd, NULL);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
1999-05-03 15:29:11 +08:00
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_ASH: /* Arithmetic shift. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
2005-04-21 15:45:39 +08:00
if (HIGHBIT (op1)) /* Shift right. */
op2 >>= op1;
2005-04-21 15:45:39 +08:00
else /* Shift left. */
op2 <<= op1;
_bfd_vms_push (abfd, (uquad) op2, -1);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_USH: /* Unsigned shift. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
2005-04-21 15:45:39 +08:00
if (HIGHBIT (op1)) /* Shift right. */
op2 >>= op1;
2005-04-21 15:45:39 +08:00
else /* Shift left. */
op2 <<= op1;
_bfd_vms_push (abfd, (uquad) op2, -1);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_ROT: /* Rotate. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
2005-04-21 15:45:39 +08:00
if (HIGHBIT (0)) /* Shift right. */
op2 >>= op1;
2005-04-21 15:45:39 +08:00
else /* Shift left. */
op2 <<= op1;
_bfd_vms_push (abfd, (uquad) op2, -1);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
2005-04-21 15:45:39 +08:00
case TIR_S_C_OPR_SEL: /* Select. */
if ((long) _bfd_vms_pop (abfd, NULL) & 0x01L)
(void) _bfd_vms_pop (abfd, NULL);
else
{
op1 = (long) _bfd_vms_pop (abfd, NULL);
(void) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) op1, -1);
}
break;
case TIR_S_C_OPR_REDEF: /* Redefine symbol to current location. */
case TIR_S_C_OPR_DFLIT: /* Define a literal. */
(*_bfd_error_handler) (_("%s: not supported"),
tir_cmd_name (ptr[-1]));
break;
default:
(*_bfd_error_handler) (_("reserved OPR cmd %d"), ptr[-1]);
1999-05-03 15:29:11 +08:00
break;
}
return ptr;
}
2005-04-21 15:45:39 +08:00
/* Control commands
See table 7-6 of the VAX/VMS linker manual. */
1999-05-03 15:29:11 +08:00
static unsigned char *
2005-04-21 15:45:39 +08:00
tir_ctl (bfd * abfd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
unsigned long dummy;
unsigned int psect;
1999-05-03 15:29:11 +08:00
#if VMS_DEBUG
_bfd_vms_debug (5, "tir_ctl %d\n", *ptr);
#endif
switch (*ptr++)
{
case TIR_S_C_CTL_SETRB:
/* Set relocation base: pop stack, set image location counter
arg: none. */
include/ * xtensa-isa-internal.h (xtensa_length_decode_fn): Warning fix. * xtensa-isa.h (xtensa_insnbuf_to_chars): Likewise. (xtensa_insnbuf_from_chars, xtensa_isa_length_from_chars): Likewise. include/coff/ * xcoff.h (struct xcoff_loader_info): Warning fix. bfd/ * bfd-in.h (bfd_elf_bfd_from_remote_memory): Warning fix. * coff-m68k.c (bfd_m68k_coff_create_embedded_relocs): Likewise. * coff-rs6000.c (xcoff_write_armap_big): Warning fixes. Remove useless assignments. (xcoff_write_archive_contents_big): Likewise. (_bfd_xcoff_put_ldsymbol_name): Likewise. * coff64-rs6000.c (_bfd_xcoff64_put_ldsymbol_name): Likewise. * coffgen.c (coff_write_symbols): Make "written" a bfd_vma. * cofflink.c (process_embedded_commands): Warning fixes. * cpu-arm.c: Delete unnecessary prototypes. Convert to C90. Warning fixes. * dwarf2.c: Warning fixes. * elf-bfd.h: Likewise. * elf-eh-frame.c: Likewise. * elf-strtab.c: Likewise. * elf.c: Likewise. * elf32-m68k.c: Likewise. * elf32-ppc.c: Likewise. * elf32-sh-symbian.c: Likewise. * elf32-sh.c: Delete unnecessary prototypes. Warning fixes. * elf64-sh64.c: Likewise. * peicode.h: Likewise. * elf64-mmix.c: Warning fixes. * elfcode.h: Likewise. * elfxx-mips.c: Likewise. * libbfd-in.h: Likewise. * libbfd.c: Likewise. * mach-o.c: Likewise. * merge.c: Likewise. * mmo.c: Likewise. * opncls.c: Likewise. * pef.c: Likewise. * srec.c: Likewise. * vms-hdr.c: Likewise. * vms-tir.c: Likewise. * xtensa-isa.c: Likewise. * xtensa-modules.c: Likewise. * xsym.c: Likewise. (pstrcmp): Use correct choice of string lengths. Fix return value. (bfd_sym_module_name): Correct string length. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate.
2005-02-20 22:59:07 +08:00
dummy = _bfd_vms_pop (abfd, (int *) &psect);
if (psect >= PRIV (section_count))
alloc_section (abfd, psect);
image_set_ptr (abfd, (int) psect, (uquad) dummy);
break;
case TIR_S_C_CTL_AUGRB:
/* Augment relocation base: increment image location counter by offset
arg: lw offset value. */
dummy = bfd_getl32 (ptr);
image_inc_ptr (abfd, (uquad) dummy);
break;
case TIR_S_C_CTL_DFLOC:
/* Define location: pop index, save location counter under index
arg: none. */
dummy = _bfd_vms_pop (abfd, NULL);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
case TIR_S_C_CTL_STLOC:
/* Set location: pop index, restore location counter from index
arg: none. */
include/ * xtensa-isa-internal.h (xtensa_length_decode_fn): Warning fix. * xtensa-isa.h (xtensa_insnbuf_to_chars): Likewise. (xtensa_insnbuf_from_chars, xtensa_isa_length_from_chars): Likewise. include/coff/ * xcoff.h (struct xcoff_loader_info): Warning fix. bfd/ * bfd-in.h (bfd_elf_bfd_from_remote_memory): Warning fix. * coff-m68k.c (bfd_m68k_coff_create_embedded_relocs): Likewise. * coff-rs6000.c (xcoff_write_armap_big): Warning fixes. Remove useless assignments. (xcoff_write_archive_contents_big): Likewise. (_bfd_xcoff_put_ldsymbol_name): Likewise. * coff64-rs6000.c (_bfd_xcoff64_put_ldsymbol_name): Likewise. * coffgen.c (coff_write_symbols): Make "written" a bfd_vma. * cofflink.c (process_embedded_commands): Warning fixes. * cpu-arm.c: Delete unnecessary prototypes. Convert to C90. Warning fixes. * dwarf2.c: Warning fixes. * elf-bfd.h: Likewise. * elf-eh-frame.c: Likewise. * elf-strtab.c: Likewise. * elf.c: Likewise. * elf32-m68k.c: Likewise. * elf32-ppc.c: Likewise. * elf32-sh-symbian.c: Likewise. * elf32-sh.c: Delete unnecessary prototypes. Warning fixes. * elf64-sh64.c: Likewise. * peicode.h: Likewise. * elf64-mmix.c: Warning fixes. * elfcode.h: Likewise. * elfxx-mips.c: Likewise. * libbfd-in.h: Likewise. * libbfd.c: Likewise. * mach-o.c: Likewise. * merge.c: Likewise. * mmo.c: Likewise. * opncls.c: Likewise. * pef.c: Likewise. * srec.c: Likewise. * vms-hdr.c: Likewise. * vms-tir.c: Likewise. * xtensa-isa.c: Likewise. * xtensa-modules.c: Likewise. * xsym.c: Likewise. (pstrcmp): Use correct choice of string lengths. Fix return value. (bfd_sym_module_name): Correct string length. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate.
2005-02-20 22:59:07 +08:00
dummy = _bfd_vms_pop (abfd, (int *) &psect);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
1999-05-03 15:29:11 +08:00
break;
1999-05-03 15:29:11 +08:00
case TIR_S_C_CTL_STKDL:
/* Stack defined location: pop index, push location counter from index
arg: none. */
include/ * xtensa-isa-internal.h (xtensa_length_decode_fn): Warning fix. * xtensa-isa.h (xtensa_insnbuf_to_chars): Likewise. (xtensa_insnbuf_from_chars, xtensa_isa_length_from_chars): Likewise. include/coff/ * xcoff.h (struct xcoff_loader_info): Warning fix. bfd/ * bfd-in.h (bfd_elf_bfd_from_remote_memory): Warning fix. * coff-m68k.c (bfd_m68k_coff_create_embedded_relocs): Likewise. * coff-rs6000.c (xcoff_write_armap_big): Warning fixes. Remove useless assignments. (xcoff_write_archive_contents_big): Likewise. (_bfd_xcoff_put_ldsymbol_name): Likewise. * coff64-rs6000.c (_bfd_xcoff64_put_ldsymbol_name): Likewise. * coffgen.c (coff_write_symbols): Make "written" a bfd_vma. * cofflink.c (process_embedded_commands): Warning fixes. * cpu-arm.c: Delete unnecessary prototypes. Convert to C90. Warning fixes. * dwarf2.c: Warning fixes. * elf-bfd.h: Likewise. * elf-eh-frame.c: Likewise. * elf-strtab.c: Likewise. * elf.c: Likewise. * elf32-m68k.c: Likewise. * elf32-ppc.c: Likewise. * elf32-sh-symbian.c: Likewise. * elf32-sh.c: Delete unnecessary prototypes. Warning fixes. * elf64-sh64.c: Likewise. * peicode.h: Likewise. * elf64-mmix.c: Warning fixes. * elfcode.h: Likewise. * elfxx-mips.c: Likewise. * libbfd-in.h: Likewise. * libbfd.c: Likewise. * mach-o.c: Likewise. * merge.c: Likewise. * mmo.c: Likewise. * opncls.c: Likewise. * pef.c: Likewise. * srec.c: Likewise. * vms-hdr.c: Likewise. * vms-tir.c: Likewise. * xtensa-isa.c: Likewise. * xtensa-modules.c: Likewise. * xsym.c: Likewise. (pstrcmp): Use correct choice of string lengths. Fix return value. (bfd_sym_module_name): Correct string length. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate.
2005-02-20 22:59:07 +08:00
dummy = _bfd_vms_pop (abfd, (int *) &psect);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
1999-05-03 15:29:11 +08:00
break;
1999-05-03 15:29:11 +08:00
default:
(*_bfd_error_handler) (_("reserved CTL cmd %d"), ptr[-1]);
break;
}
1999-05-03 15:29:11 +08:00
return ptr;
}
/* Handle command from TIR section. */
1999-05-03 15:29:11 +08:00
static unsigned char *
2005-04-21 15:45:39 +08:00
tir_cmd (bfd * abfd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
struct
{
1999-05-03 15:29:11 +08:00
int mincod;
int maxcod;
unsigned char * (*explain) (bfd *, unsigned char *);
}
tir_table[] =
{
{ 0, TIR_S_C_MAXSTACOD, tir_sta },
{ TIR_S_C_MINSTOCOD, TIR_S_C_MAXSTOCOD, tir_sto },
{ TIR_S_C_MINOPRCOD, TIR_S_C_MAXOPRCOD, tir_opr },
{ TIR_S_C_MINCTLCOD, TIR_S_C_MAXCTLCOD, tir_ctl },
{ -1, -1, NULL }
1999-05-03 15:29:11 +08:00
};
int i = 0;
#if VMS_DEBUG
_bfd_vms_debug (4, "tir_cmd %d/%x\n", *ptr, *ptr);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
2005-04-21 15:45:39 +08:00
if (*ptr & 0x80)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Store immediate. */
1999-05-03 15:29:11 +08:00
i = 128 - (*ptr++ & 0x7f);
image_dump (abfd, ptr, i, 0);
ptr += i;
}
else
{
while (tir_table[i].mincod >= 0)
{
if ( (tir_table[i].mincod <= *ptr)
&& (*ptr <= tir_table[i].maxcod))
1999-05-03 15:29:11 +08:00
{
ptr = tir_table[i].explain (abfd, ptr);
break;
}
i++;
}
if (tir_table[i].mincod < 0)
{
(*_bfd_error_handler) (_("obj code %d not found"), *ptr);
1999-05-03 15:29:11 +08:00
ptr = 0;
}
}
return ptr;
}
/* Handle command from ETIR section. */
1999-05-03 15:29:11 +08:00
static int
2005-04-21 15:45:39 +08:00
etir_cmd (bfd * abfd, int cmd, unsigned char *ptr)
1999-05-03 15:29:11 +08:00
{
static struct
{
1999-05-03 15:29:11 +08:00
int mincod;
int maxcod;
2005-04-21 15:45:39 +08:00
bfd_boolean (*explain) (bfd *, int, unsigned char *);
}
etir_table[] =
{
1999-05-03 15:29:11 +08:00
{ ETIR_S_C_MINSTACOD, ETIR_S_C_MAXSTACOD, etir_sta },
{ ETIR_S_C_MINSTOCOD, ETIR_S_C_MAXSTOCOD, etir_sto },
{ ETIR_S_C_MINOPRCOD, ETIR_S_C_MAXOPRCOD, etir_opr },
{ ETIR_S_C_MINCTLCOD, ETIR_S_C_MAXCTLCOD, etir_ctl },
{ ETIR_S_C_MINSTCCOD, ETIR_S_C_MAXSTCCOD, etir_stc },
{ -1, -1, NULL }
};
int i = 0;
#if VMS_DEBUG
_bfd_vms_debug (4, "etir_cmd %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
1999-05-03 15:29:11 +08:00
#endif
while (etir_table[i].mincod >= 0)
{
if ( (etir_table[i].mincod <= cmd)
&& (cmd <= etir_table[i].maxcod))
1999-05-03 15:29:11 +08:00
{
if (!etir_table[i].explain (abfd, cmd, ptr))
return -1;
break;
}
i++;
}
#if VMS_DEBUG
_bfd_vms_debug (4, "etir_cmd: = 0\n");
#endif
return 0;
}
/* Text Information and Relocation Records (OBJ$C_TIR)
handle tir record. */
1999-05-03 15:29:11 +08:00
static int
2005-04-21 15:45:39 +08:00
analyze_tir (bfd * abfd, unsigned char *ptr, unsigned int length)
1999-05-03 15:29:11 +08:00
{
unsigned char *maxptr;
#if VMS_DEBUG
_bfd_vms_debug (3, "analyze_tir: %d bytes\n", length);
#endif
maxptr = ptr + length;
while (ptr < maxptr)
{
ptr = tir_cmd (abfd, ptr);
if (ptr == 0)
return -1;
}
return 0;
}
/* Text Information and Relocation Records (EOBJ$C_ETIR)
handle etir record. */
1999-05-03 15:29:11 +08:00
static int
2005-04-21 15:45:39 +08:00
analyze_etir (bfd * abfd, unsigned char *ptr, unsigned int length)
1999-05-03 15:29:11 +08:00
{
int cmd;
unsigned char *maxptr;
int result = 0;
#if VMS_DEBUG
_bfd_vms_debug (3, "analyze_etir: %d bytes\n", length);
#endif
maxptr = ptr + length;
while (ptr < maxptr)
{
cmd = bfd_getl16 (ptr);
length = bfd_getl16 (ptr + 2);
result = etir_cmd (abfd, cmd, ptr+4);
if (result != 0)
break;
ptr += length;
}
#if VMS_DEBUG
_bfd_vms_debug (3, "analyze_etir: = %d\n", result);
#endif
return result;
}
/* Process ETIR record
Return 0 on success, -1 on error. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_slurp_tir (bfd * abfd, int objtype)
1999-05-03 15:29:11 +08:00
{
int result;
#if VMS_DEBUG
_bfd_vms_debug (2, "TIR/ETIR\n");
#endif
switch (objtype)
{
case EOBJ_S_C_ETIR:
2005-04-21 15:45:39 +08:00
PRIV (vms_rec) += 4; /* Skip type, size. */
PRIV (rec_size) -= 4;
result = analyze_etir (abfd, PRIV (vms_rec), (unsigned) PRIV (rec_size));
break;
case OBJ_S_C_TIR:
2005-04-21 15:45:39 +08:00
PRIV (vms_rec) += 1; /* Skip type. */
PRIV (rec_size) -= 1;
result = analyze_tir (abfd, PRIV (vms_rec), (unsigned) PRIV (rec_size));
break;
default:
result = -1;
break;
1999-05-03 15:29:11 +08:00
}
return result;
}
/* Process EDBG record
Return 0 on success, -1 on error
Not implemented yet. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_slurp_dbg (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (2, "DBG/EDBG\n");
#endif
abfd->flags |= (HAS_DEBUG | HAS_LINENO);
return 0;
}
/* Process ETBT record
Return 0 on success, -1 on error
Not implemented yet. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_slurp_tbt (bfd * abfd ATTRIBUTE_UNUSED,
int objtype ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (2, "TBT/ETBT\n");
#endif
return 0;
}
/* Process LNK record
Return 0 on success, -1 on error
Not implemented yet. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_slurp_lnk (bfd * abfd ATTRIBUTE_UNUSED,
int objtype ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (2, "LNK\n");
#endif
return 0;
}
2005-04-21 15:45:39 +08:00
/* Start ETIR record for section #index at virtual addr offset. */
static void
start_etir_record (bfd * abfd, int index, uquad offset, bfd_boolean justoffset)
{
if (!justoffset)
{
/* One ETIR per section. */
_bfd_vms_output_begin (abfd, EOBJ_S_C_ETIR, -1);
_bfd_vms_output_push (abfd);
}
/* Push start offset. */
_bfd_vms_output_begin (abfd, ETIR_S_C_STA_PQ, -1);
_bfd_vms_output_long (abfd, (unsigned long) index);
_bfd_vms_output_quad (abfd, (uquad) offset);
_bfd_vms_output_flush (abfd);
/* Start = pop (). */
_bfd_vms_output_begin (abfd, ETIR_S_C_CTL_SETRB, -1);
_bfd_vms_output_flush (abfd);
}
static void
end_etir_record (bfd * abfd)
{
_bfd_vms_output_pop (abfd);
_bfd_vms_output_end (abfd);
}
/* WRITE ETIR SECTION
This is still under construction and therefore not documented. */
1999-05-03 15:29:11 +08:00
static void
2005-04-21 15:45:39 +08:00
sto_imm (bfd * abfd, vms_section *sptr, bfd_vma vaddr, int index)
1999-05-03 15:29:11 +08:00
{
int size;
int ssize;
unsigned char *cptr;
#if VMS_DEBUG
_bfd_vms_debug (8, "sto_imm %d bytes\n", sptr->size);
_bfd_hexdump (9, sptr->contents, (int) sptr->size, (int) vaddr);
1999-05-03 15:29:11 +08:00
#endif
ssize = sptr->size;
cptr = sptr->contents;
while (ssize > 0)
{
2005-04-21 15:45:39 +08:00
/* Try all the rest. */
size = ssize;
1999-05-03 15:29:11 +08:00
if (_bfd_vms_output_check (abfd, size) < 0)
2005-04-21 15:45:39 +08:00
{
/* Doesn't fit, split ! */
1999-05-03 15:29:11 +08:00
end_etir_record (abfd);
start_etir_record (abfd, index, vaddr, FALSE);
2005-04-21 15:45:39 +08:00
/* Get max size. */
size = _bfd_vms_output_check (abfd, 0);
/* More than what's left ? */
if (size > ssize)
1999-05-03 15:29:11 +08:00
size = ssize;
}
_bfd_vms_output_begin (abfd, ETIR_S_C_STO_IMM, -1);
_bfd_vms_output_long (abfd, (unsigned long) (size));
1999-05-03 15:29:11 +08:00
_bfd_vms_output_dump (abfd, cptr, size);
_bfd_vms_output_flush (abfd);
#if VMS_DEBUG
_bfd_vms_debug (10, "dumped %d bytes\n", size);
_bfd_hexdump (10, cptr, (int) size, (int) vaddr);
1999-05-03 15:29:11 +08:00
#endif
vaddr += size;
ssize -= size;
cptr += size;
}
}
/* Write section contents for bfd abfd. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_write_tir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
asection *section;
vms_section *sptr;
int nextoffset;
#if VMS_DEBUG
_bfd_vms_debug (2, "vms_write_tir (%p, %d)\n", abfd, objtype);
#endif
_bfd_vms_output_alignment (abfd, 4);
nextoffset = 0;
PRIV (vms_linkage_index) = 1;
1999-05-03 15:29:11 +08:00
/* Dump all other sections. */
1999-05-03 15:29:11 +08:00
section = abfd->sections;
while (section != NULL)
{
#if VMS_DEBUG
_bfd_vms_debug (4, "writing %d. section '%s' (%d bytes)\n",
section->index, section->name,
bfd/ * section.c (struct sec): Rename "_cooked_size" to "size". Rename "_raw_size" to "rawsize". (STD_SECTION): Adjust comments. (bfd_set_section_size, bfd_get_section_contents): Use size. (bfd_malloc_and_get_section): New function. * bfd-in.h (bfd_section_size, bfd_get_section_size): Use size. * coff-sh.c (sh_relax_section): Alloc coff_section_data struct early. Correctly free reloc and contents memory. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Delete FIXME and fake CIE now that we can shink section size to zero. (_bfd_elf_write_section_eh_frame): Likewise.. * elf32-ppc.c (ppc_elf_relax_section): Delay reading section contents. * elf-m10300.c (mn10300_elf_final_link_relocate): Don't use _bfd_stab_section_offset. Use _bfd_elf_section_offset. * stabs.c (_bfd_stab_section_offset_): Remove unused args and unneeded indirection. * elf.c (_bfd_elf_section_offset): .. and update call. * libbfd-in.h (_bfd_stab_section_offset): Update prototype. * libbfd.h: Regenerate. * bfd-in2.h: Regenerate. Replace occurrences of "_raw_size" and "_cooked_size" in most places with "size". Set new "rawsize" for stabs, eh_frame, and SEC_MERGE sections. Use "rawsize", if non-zero, for bfd_get_section_contents calls if the section might be a stabs, eh_frame, or SEC_MERGE section. Similarly use "rawsize", if non-zero, in reloc functions to validate reloc addresses. Use new bfd_malloc_and_get_section in most places where bfd_get_section_contents was called. Expand all occurrences of bfd_section_size and bfd_get_section_size. Rename "raw_size" var in grok_prstatus and similar functions to "size". * aix386-core.c (aix386_core_file_p): .. * aix5ppc-core.c (xcoff64_core_p): .. * aout-adobe.c (aout_adobe_callback, aout_adobe_write_object_contents, aout_adobe_set_section_contents): .. * aout-target.h (callback): .. * aout-tic30.c (tic30_aout_callback, tic30_aout_final_link_relocate, MY_bfd_final_link): .. * aoutf1.h (sunos4_core_file_p): .. * aoutx.h (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, translate_from_native_sym_flags, final_link, aout_link_input_section): .. * binary.c (binary_object_p, binary_canonicalize_symtab, binary_set_section_contents): .. * bout.c (b_out_callback, b_out_write_object_contents, b_out_set_section_contents, b_out_bfd_relax_section, b_out_bfd_get_relocated_section_contents): .. * cisco-core.c (cisco_core_file_validate): .. * coff-alpha.c (alpha_ecoff_object_p, alpha_ecoff_get_relocated_section_conten, alpha_relocate_section): .. * coff-arm.c (coff_arm_relocate_section, bfd_arm_allocate_interworking_sections): .. * coff-h8300.c (h8300_reloc16_extra_cases, h8300_bfd_link_add_symbols): .. * coff-mips.c (mips_refhi_reloc, mips_gprel_reloc): .. * coff-ppc.c (coff_ppc_relocate_section, ppc_allocate_toc_section, ppc_bfd_coff_final_link): .. * coff-rs6000.c (xcoff_reloc_type_br, xcoff_ppc_relocate_section): .. * coff-sh.c (sh_relax_section, sh_relax_delete_bytes, sh_align_loads, sh_coff_get_relocated_section_contents): .. * coff64-rs6000.c (xcoff64_write_object_contents, xcoff64_reloc_type_br, xcoff64_ppc_relocate_section): .. * coffcode.h (coff_compute_section_file_positions, coff_write_object_contents): .. * coffgen.c (make_a_section_from_file, coff_write_symbols, coff_section_symbol, build_debug_section): .. * cofflink.c (coff_link_add_symbols, _bfd_coff_final_link, process_embedded_commands, _bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): .. * cpu-arm.c (bfd_arm_update_notes, bfd_arm_get_mach_from_notes): .. * cpu-ns32k.c (do_ns32k_reloc, _bfd_ns32k_final_link_relocate): .. * dwarf1.c (parse_line_table, _bfd_dwarf1_find_nearest_line): .. * dwarf2.c (read_indirect_string, read_abbrevs, decode_line_info, _bfd_dwarf2_find_nearest_line): .. * ecoff.c (bfd_debug_section, ecoff_set_symbol_info, ecoff_compute_section_file_positions, _bfd_ecoff_write_object_contents, ecoff_indirect_link_order): .. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame, _bfd_elf_discard_section_eh_frame_hdr, _bfd_elf_maybe_strip_eh_frame_hdr, _bfd_elf_eh_frame_section_offset, _bfd_elf_write_section_eh_frame, _bfd_elf_write_section_eh_frame_hdr): .. * elf-hppa.h (elf_hppa_sort_unwind): .. * elf-m10200.c (mn10200_elf_relax_section, mn10200_elf_relax_delete_bytes, mn10200_elf_get_relocated_section_contents): .. * elf-m10300.c (_bfd_mn10300_elf_create_got_section, mn10300_elf_check_relocs, mn10300_elf_relax_section, mn10300_elf_relax_delete_bytes, mn10300_elf_get_relocated_section_contents, _bfd_mn10300_elf_adjust_dynamic_symbol, _bfd_mn10300_elf_discard_copies, _bfd_mn10300_elf_size_dynamic_sections, _bfd_mn10300_elf_finish_dynamic_sections): .. * elf.c (_bfd_elf_print_private_bfd_data, bfd_elf_get_bfd_needed_list, _bfd_elf_make_section_from_phdr, elf_fake_sections, bfd_elf_set_group_contents, map_sections_to_segments, elf_sort_sections, assign_file_positions_for_segments, SECTION_SIZE, copy_private_bfd_data, _bfd_elf_get_dynamic_reloc_upper_bound, _bfd_elf_canonicalize_dynamic_reloc, elfcore_maybe_make_sect, _bfd_elfcore_make_pseudosection, elfcore_grok_prstatus, elfcore_grok_lwpstatus, elfcore_grok_win32pstatus, elfcore_grok_note, elfcore_grok_nto_status, elfcore_grok_nto_gregs, _bfd_elf_rel_local_sym, _bfd_elf_get_synthetic_symtab): .. * elf32-arm.h (bfd_elf32_arm_allocate_interworking_sect, bfd_elf32_arm_process_before_allocation, elf32_arm_adjust_dynamic_symbol, allocate_dynrelocs, elf32_arm_size_dynamic_sections, elf32_arm_finish_dynamic_sections, elf32_arm_write_section): .. * elf32-cris.c (cris_elf_grok_prstatus, elf_cris_finish_dynamic_sections, cris_elf_gc_sweep_hook, elf_cris_adjust_gotplt_to_got, elf_cris_adjust_dynamic_symbol, cris_elf_check_relocs, elf_cris_size_dynamic_sections, elf_cris_discard_excess_dso_dynamics, elf_cris_discard_excess_program_dynamics): .. * elf32-d30v.c (bfd_elf_d30v_reloc, bfd_elf_d30v_reloc_21): .. * elf32-dlx.c (_bfd_dlx_elf_hi16_reloc): .. * elf32-frv.c (_frvfdpic_add_dyn_reloc, _frvfdpic_add_rofixup, _frv_create_got_section, _frvfdpic_assign_plt_entries, elf32_frvfdpic_size_dynamic_sections, elf32_frvfdpic_modify_segment_map, elf32_frvfdpic_finish_dynamic_sections): .. * elf32-h8300.c (elf32_h8_relax_section, elf32_h8_relax_delete_bytes, elf32_h8_get_relocated_section_contents): .. * elf32-hppa.c (hppa_build_one_stub, hppa_size_one_stub, elf32_hppa_adjust_dynamic_symbol, allocate_plt_static, allocate_dynrelocs, elf32_hppa_size_dynamic_sections, group_sections, elf32_hppa_size_stubs, elf32_hppa_set_gp, elf32_hppa_build_stubs, elf32_hppa_finish_dynamic_sections): .. * elf32-i370.c (i370_elf_adjust_dynamic_symbol, i370_elf_size_dynamic_sections, i370_elf_check_relocs, i370_elf_finish_dynamic_sections): .. * elf32-i386.c (elf_i386_grok_prstatus, elf_i386_adjust_dynamic_symbol, allocate_dynrelocs, elf_i386_size_dynamic_sections, elf_i386_relocate_section, elf_i386_finish_dynamic_sections): .. * elf32-i860.c (i860_howto_pc26_reloc, i860_howto_pc16_reloc, i860_howto_highadj_reloc, i860_howto_splitn_reloc): .. * elf32-ip2k.c (ip2k_is_switch_table_128, ip2k_relax_switch_table_128, ip2k_is_switch_table_256, ip2k_relax_switch_table_256, ip2k_elf_relax_section, adjust_all_relocations, ip2k_elf_relax_delete_bytes): .. * elf32-m32r.c (m32r_elf_do_10_pcrel_reloc, m32r_elf_hi16_reloc, m32r_elf_generic_reloc, m32r_elf_adjust_dynamic_symbol, allocate_dynrelocs, m32r_elf_size_dynamic_sections, m32r_elf_relocate_section, m32r_elf_finish_dynamic_sections, m32r_elf_relax_section, m32r_elf_relax_delete_bytes, m32r_elf_get_relocated_section_contents): .. * elf32-m68hc11.c (m68hc11_elf_build_one_stub, m68hc11_elf_size_one_stub, m68hc11_elf_relax_section, m68hc11_elf_relax_delete_bytes): .. * elf32-m68hc12.c (m68hc12_elf_build_one_stub, m68hc12_elf_size_one_stub): .. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs, elf32_m68hc11_build_stubs, m68hc11_elf_special_reloc): .. * elf32-m68k.c (elf_m68k_check_relocs, elf_m68k_gc_sweep_hook, elf_m68k_adjust_dynamic_symbol, elf_m68k_size_dynamic_sections, elf_m68k_discard_copies, elf_m68k_finish_dynamic_sections): .. * elf32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elf32-or32.c (or32_elf_consth_reloc): .. * elf32-ppc.c (ppc_elf_relax_section, ppc_elf_addr16_ha_reloc, elf_create_pointer_linker_section, ppc_elf_create_linker_section, ppc_elf_additional_program_headers, ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs, ppc_elf_size_dynamic_sections, ppc_elf_finish_dynamic_sections, ppc_elf_grok_prstatus, ppc_elf_final_write_processing): .. * elf32-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections, elf_s390_grok_prstatus): .. * elf32-sh.c (sh_elf_reloc_loop, sh_elf_relax_section, sh_elf_relax_delete_bytes, sh_elf_align_loads, sh_elf_adjust_dynamic_symbol, allocate_dynrelocs, sh_elf_size_dynamic_sections, sh_elf_get_relocated_section_contents, sh_elf_finish_dynamic_sections, elf32_shlin_grok_prstatus): .. * elf32-sh64-com.c (sh64_address_in_cranges, sh64_get_contents_type): .. * elf32-sh64.c (sh64_find_section_for_address, sh64_elf_final_write_processing): .. * elf32-sparc.c (sparc_elf_wdisp16_reloc, sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_adjust_dynamic_symbol, allocate_dynrelocs, elf32_sparc_size_dynamic_sections, elf32_sparc_relocate_section, elf32_sparc_finish_dynamic_sections): .. * elf32-v850.c (v850_elf_reloc, v850_elf_relax_section): .. * elf32-vax.c (elf_vax_check_relocs, elf_vax_adjust_dynamic_symbol, elf_vax_size_dynamic_sections, elf_vax_discard_copies, elf_vax_instantiate_got_entries, elf_vax_relocate_section, elf_vax_finish_dynamic_sections): .. * elf32-xstormy16.c (xstormy16_elf_24_reloc, xstormy16_elf_check_relocs, xstormy16_relax_plt_check, xstormy16_elf_relax_section, xstormy16_elf_always_size_sections, xstormy16_elf_finish_dynamic_sections): .. * elf32-xtensa.c (xtensa_read_table_entries, elf_xtensa_allocate_got_size, elf_xtensa_allocate_local_got_size, elf_xtensa_size_dynamic_sections, elf_xtensa_do_reloc, bfd_elf_xtensa_reloc, elf_xtensa_relocate_section, elf_xtensa_combine_prop_entries, elf_xtensa_finish_dynamic_sections, elf_xtensa_discard_info_for_section, elf_xtensa_grok_prstatus, get_relocation_opcode, retrieve_contents, find_relaxable_sections, collect_source_relocs, is_resolvable_asm_expansion, remove_literals, relax_section, shrink_dynamic_reloc_sections, relax_property_section, xtensa_callback_required_dependence): .. * elf64-alpha.c (elf64_alpha_reloc_gpdisp, elf64_alpha_relax_section, elf64_alpha_check_relocs, elf64_alpha_adjust_dynamic_symbol, elf64_alpha_calc_got_offsets_for_symbol, elf64_alpha_calc_got_offsets, elf64_alpha_size_plt_section, elf64_alpha_size_plt_section_1, elf64_alpha_always_size_sections, elf64_alpha_calc_dynrel_sizes, elf64_alpha_size_rela_got_section, elf64_alpha_size_rela_got_1, elf64_alpha_size_dynamic_sections, elf64_alpha_emit_dynrel, elf64_alpha_finish_dynamic_sections, elf64_alpha_final_link): .. * elf64-hppa.c (allocate_dynrel_entries, elf64_hppa_size_dynamic_sections, elf64_hppa_finish_dynamic_sections): .. * elf64-mips.c (mips_elf64_gprel32_reloc, mips16_gprel_reloc, mips_elf64_canonicalize_dynamic_reloc, mips_elf64_slurp_reloc_table, elf64_mips_grok_prstatus): .. * elf64-mmix.c (mmix_elf_perform_relocation, mmix_elf_reloc, mmix_elf_relocate_section, mmix_elf_final_link, mmix_set_relaxable_size, _bfd_mmix_after_linker_allocation, mmix_elf_relax_section, mmix_elf_get_section_contents): .. * elf64-ppc.c (ppc64_elf_object_p, ppc64_elf_grok_prstatus, ppc64_elf_check_relocs, ppc64_elf_func_desc_adjust, ppc64_elf_adjust_dynamic_symbol, ppc64_elf_edit_opd, allocate_dynrelocs, ppc64_elf_size_dynamic_sections, ppc_build_one_stub, ppc_size_one_stub, ppc64_elf_next_toc_section, toc_adjusting_stub_needed, group_sections, ppc64_elf_size_stubs, ppc64_elf_build_stubs, ppc64_elf_relocate_section, ppc64_elf_finish_dynamic_sections): .. * elf64-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections): .. * elf64-sh64.c (sh_elf64_get_relocated_section_contents, sh_elf64_check_relocs, sh64_elf64_adjust_dynamic_symbol, sh64_elf64_discard_copies, sh64_elf64_size_dynamic_sections, sh64_elf64_finish_dynamic_sections): .. * elf64-sparc.c (sparc64_elf_slurp_reloc_table, init_insn_reloc, sparc64_elf_check_relocs, sparc64_elf_adjust_dynamic_symbol, sparc64_elf_size_dynamic_sections, sparc64_elf_relocate_section, sparc64_elf_finish_dynamic_symbol, sparc64_elf_finish_dynamic_sections): .. * elf64-x86-64.c (elf64_x86_64_grok_prstatus, elf64_x86_64_adjust_dynamic_symbol, allocate_dynrelocs, elf64_x86_64_size_dynamic_sections, elf64_x86_64_relocate_section, elf64_x86_64_finish_dynamic_sections): .. * elfarm-nabi.c (elf32_arm_nabi_grok_prstatus): .. * elfcode.h (elf_slurp_reloc_table): .. * elflink.c (_bfd_elf_create_got_section, elf_add_dt_needed_tag, elf_finalize_dynstr, elf_link_add_object_symbols, bfd_elf_size_dynamic_sections, elf_link_sort_relocs, elf_link_input_bfd, bfd_elf_final_link, bfd_elf_discard_info): .. * elfn32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elfxx-ia64.c (elfNN_ia64_relax_section, allocate_dynrel_entries, elfNN_ia64_size_dynamic_sections, elfNN_ia64_install_dyn_reloc, elfNN_ia64_choose_gp, elfNN_ia64_final_link, elfNN_ia64_finish_dynamic_sections): .. * elfxx-mips.c (mips_elf_create_procedure_table, mips_elf_check_mips16_stubs, _bfd_mips_elf_gprel16_with_gp, _bfd_mips_elf_hi16_reloc, _bfd_mips_elf_generic_reloc, mips_elf_global_got_index, mips_elf_multi_got, mips_elf_create_compact_rel_section, mips_elf_calculate_relocation, mips_elf_allocate_dynamic_relocations, mips_elf_create_dynamic_relocation, _bfd_mips_elf_fake_sections, _bfd_mips_relax_section, _bfd_mips_elf_adjust_dynamic_symbol, _bfd_mips_elf_always_size_sections, _bfd_mips_elf_size_dynamic_sections, _bfd_mips_elf_finish_dynamic_symbol, _bfd_mips_elf_finish_dynamic_sections, _bfd_mips_elf_modify_segment_map, _bfd_mips_elf_discard_info, _bfd_mips_elf_write_section, _bfd_mips_elf_set_section_contents, _bfd_elf_mips_get_relocated_section_contents, _bfd_mips_elf_final_link, _bfd_mips_elf_merge_private_bfd_data): .. * hp300hpux.c (callback): .. * hppabsd-core.c (make_bfd_asection): .. * hpux-core.c (make_bfd_asection): .. * i386linux.c (linux_link_create_dynamic_sections, bfd_i386linux_size_dynamic_sections, linux_finish_dynamic_link): .. * i386msdos.c (msdos_write_object_contents): .. * i386os9k.c (os9k_callback, os9k_write_object_contents, os9k_set_section_contents): .. * ieee.c (parse_expression, ieee_slurp_external_symbols, ieee_slurp_sections, ieee_slurp_debug, ieee_slurp_section_data, ieee_write_section_part, do_with_relocs, do_as_repeat, do_without_relocs, ieee_write_debug_part, init_for_output, ieee_set_section_contents): .. * ihex.c (ihex_scan, ihex_read_section, ihex_get_section_contents): .. * irix-core.c (do_sections, make_bfd_asection): .. * libaout.h (aout_section_merge_with_text_p): .. * libbfd.c (_bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window): .. * linker.c (default_indirect_link_order): .. * lynx-core.c (make_bfd_asection): .. * m68klinux.c (linux_link_create_dynamic_sections, bfd_m68klinux_size_dynamic_sections, linux_finish_dynamic_link): .. * mach-o.c (bfd_mach_o_make_bfd_section, bfd_mach_o_scan_read_dylinker, bfd_mach_o_scan_read_dylib, bfd_mach_o_scan_read_thread, bfd_mach_o_scan_read_symtab, bfd_mach_o_scan_read_segment): .. * merge.c (_bfd_add_merge_section, record_section, merge_strings, _bfd_merge_sections): .. * mmo.c (mmo_find_sec_w_addr, mmo_get_spec_section, mmo_get_loc, mmo_map_set_sizes, mmo_canonicalize_symtab, mmo_internal_write_section, mmo_write_object_contents): .. * netbsd-core.c (netbsd_core_file_p): .. * nlm32-alpha.c (nlm_alpha_read_reloc, nlm_alpha_write_import, nlm_alpha_set_public_section): .. * nlm32-ppc.c (nlm_powerpc_read_reloc, nlm_powerpc_write_reloc): .. * nlm32-sparc.c (nlm_sparc_write_import): .. * nlmcode.h (add_bfd_section, nlm_swap_auxiliary_headers_in, nlm_compute_section_file_positions): .. * oasys.c (oasys_object_p, oasys_slurp_section_data, oasys_write_sections, oasys_write_data, oasys_set_section_contents): .. * opncls.c (get_debug_link_info): .. * osf-core.c (make_bfd_asection): .. * pdp11.c (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, squirt_out_relocs, final_link, aout_link_input_section): .. * peXXigen.c (_bfd_XXi_swap_sym_in, _bfd_XXi_swap_aouthdr_out, pe_print_idata, pe_print_edata, pe_print_pdata, pe_print_reloc): .. * pef.c (bfd_pef_make_bfd_section, bfd_pef_print_loader_section, bfd_pef_scan_start_address, bfd_pef_parse_symbols): .. * ppcboot.c (ppcboot_object_p, ppcboot_canonicalize_symtab): .. * ptrace-core.c (ptrace_unix_core_file_p): .. * reloc.c (bfd_perform_relocation, bfd_install_relocation, _bfd_final_link_relocate, bfd_generic_relax_section, bfd_generic_get_relocated_section_contents): .. * reloc16.c (bfd_coff_reloc16_relax_section, bfd_coff_reloc16_get_relocated_section_c): .. * riscix.c (riscix_some_aout_object_p): .. * rs6000-core.c (read_hdr, make_bfd_asection): .. * sco5-core.c (make_bfd_asection): .. * simple.c (bfd_simple_get_relocated_section_contents): .. * som.c (som_object_setup, setup_sections, som_prep_headers, som_write_fixups, som_begin_writing, bfd_section_from_som_symbol, som_set_reloc_info, som_get_section_contents, som_bfd_link_split_section): .. * sparclinux.c (linux_link_create_dynamic_sections, bfd_sparclinux_size_dynamic_sections, linux_finish_dynamic_link): .. * srec.c (srec_scan, srec_read_section, srec_get_section_contents): .. * stabs.c (_bfd_link_section_stabs, _bfd_discard_section_stabs, _bfd_write_stab_strings, _bfd_stab_section_offset): .. * sunos.c (sunos_read_dynamic_info, sunos_create_dynamic_sections, bfd_sunos_size_dynamic_sections, sunos_scan_std_relocs, sunos_scan_ext_relocs, sunos_scan_dynamic_symbol, sunos_write_dynamic_symbol, sunos_check_dynamic_reloc, sunos_finish_dynamic_link): .. * syms.c (_bfd_stab_section_find_nearest_line): .. * tekhex.c (first_phase, tekhex_set_section_contents, tekhex_write_object_contents): .. * trad-core.c (trad_unix_core_file_p): .. * versados.c (process_esd, process_otr, process_otr): .. * vms-gsd.c (_bfd_vms_slurp_gsd, _bfd_vms_write_gsd): .. * vms-misc.c (add_new_contents): .. * vms-tir.c (check_section, new_section, _bfd_vms_write_tir): .. * vms.c (vms_set_section_contents): .. * xcofflink.c (xcoff_get_section_contents, xcoff_link_add_symbols, xcoff_sweep, bfd_xcoff_size_dynamic_sections, xcoff_build_ldsyms, _bfd_xcoff_bfd_final_link, xcoff_link_input_bfd): .. * xsym.c (bfd_sym_scan): .. See above. binutils/ * objcopy.c (copy_section): Don't set _cooked_size. include/ * bfdlink.h (struct bfd_link_order): Update comment. ld/ * ldlang.c (print_output_section_statement): Don't print size before relaxation. (IGNORE_SECTION): Remove bfd arg. Update all callers. * ldexp.c (fold_name): .. See below. * ldlang.c (section_already_linked, print_output_section_statement, print_input_section, insert_pad, size_input_section, lang_check_section_addresses, lang_size_sections_1, lang_size_sections, lang_do_assignments_1, lang_set_startof, lang_one_common, lang_reset_memory_regions, lang_process, lang_abs_symbol_at_end_of, lang_do_version_exports_section): .. * ldwrite.c (build_link_order, clone_section, ds, split_sections): .. * pe-dll.c (process_def_file, generate_reloc): .. * emultempl/elf32.em (gld${EMULATION_NAME}_find_statement_assignment, gld${EMULATION_NAME}_before_allocation): .. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): .. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_before_allocation, sh64_elf_${EMULATION_NAME}_after_allocation): .. * emultempl/sunos.em (gld${EMULATION_NAME}_before_allocation): .. * emultempl/xtensaelf.em (ld_assign_relative_paged_dot, ld_local_file_relocations_fit, ld_xtensa_insert_page_offsets): Use "size" instead of "_raw_size" and "_cooked_size". Expand bfd_section_size macro invocations.
2004-06-24 12:46:28 +08:00
(int) (section->size));
1999-05-03 15:29:11 +08:00
#endif
if (section->flags & SEC_RELOC)
{
int i;
if ((i = section->reloc_count) <= 0)
2005-04-21 15:45:39 +08:00
(*_bfd_error_handler) (_("SEC_RELOC with no relocs in section %s"),
section->name);
1999-05-03 15:29:11 +08:00
#if VMS_DEBUG
else
{
arelent **rptr;
_bfd_vms_debug (4, "%d relocations:\n", i);
rptr = section->orelocation;
while (i-- > 0)
{
_bfd_vms_debug (4, "sym %s in sec %s, value %08lx, addr %08lx, off %08lx, len %d: %s\n",
(*(*rptr)->sym_ptr_ptr)->name,
(*(*rptr)->sym_ptr_ptr)->section->name,
(long) (*(*rptr)->sym_ptr_ptr)->value,
(*rptr)->address, (*rptr)->addend,
bfd_get_reloc_size ((*rptr)->howto),
(*rptr)->howto->name);
1999-05-03 15:29:11 +08:00
rptr++;
}
}
#endif
}
if ((section->flags & SEC_HAS_CONTENTS)
&& (! bfd_is_com_section (section)))
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Virtual addr in section. */
bfd_vma vaddr;
1999-05-03 15:29:11 +08:00
sptr = _bfd_get_vms_section (abfd, section->index);
if (sptr == NULL)
{
bfd_set_error (bfd_error_no_contents);
return -1;
}
vaddr = (bfd_vma) (sptr->offset);
1999-05-03 15:29:11 +08:00
start_etir_record (abfd, section->index, (uquad) sptr->offset,
FALSE);
1999-05-03 15:29:11 +08:00
2005-04-21 15:45:39 +08:00
while (sptr != NULL)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* One STA_PQ, CTL_SETRB per vms_section. */
if (section->flags & SEC_RELOC)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Check for relocs. */
1999-05-03 15:29:11 +08:00
arelent **rptr = section->orelocation;
int i = section->reloc_count;
1999-05-03 15:29:11 +08:00
for (;;)
{
bfd_size_type addr = (*rptr)->address;
bfd_size_type len = bfd_get_reloc_size ((*rptr)->howto);
2005-04-21 15:45:39 +08:00
if (sptr->offset < addr)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Sptr starts before reloc. */
bfd_size_type before = addr - sptr->offset;
2005-04-21 15:45:39 +08:00
if (sptr->size <= before)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Complete before. */
1999-05-03 15:29:11 +08:00
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
break;
}
2005-04-21 15:45:39 +08:00
else
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Partly before. */
1999-05-03 15:29:11 +08:00
int after = sptr->size - before;
2005-04-21 15:45:39 +08:00
1999-05-03 15:29:11 +08:00
sptr->size = before;
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
sptr->contents += before;
sptr->offset += before;
sptr->size = after;
}
}
2005-04-21 15:45:39 +08:00
else if (sptr->offset == addr)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Sptr starts at reloc. */
1999-05-03 15:29:11 +08:00
asymbol *sym = *(*rptr)->sym_ptr_ptr;
asection *sec = sym->section;
switch ((*rptr)->howto->type)
{
case ALPHA_R_IGNORE:
break;
case ALPHA_R_REFLONG:
{
if (bfd_is_und_section (sym->section))
{
int slen = strlen ((char *) sym->name);
char *hash;
if (_bfd_vms_output_check (abfd, slen) < 0)
1999-05-03 15:29:11 +08:00
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_GBL_LW,
-1);
hash = (_bfd_vms_length_hash_symbol
(abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_vms_output_counted (abfd, hash);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
else if (bfd_is_abs_section (sym->section))
{
if (_bfd_vms_output_check (abfd, 16) < 0)
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_LW,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_quad (abfd,
(uquad) sym->value);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_LW,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
else
{
if (_bfd_vms_output_check (abfd, 32) < 0)
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_PQ,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_long (abfd,
(unsigned long) (sec->index));
1999-05-03 15:29:11 +08:00
_bfd_vms_output_quad (abfd,
((uquad) (*rptr)->addend
+ (uquad) sym->value));
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_LW,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
}
break;
case ALPHA_R_REFQUAD:
{
if (bfd_is_und_section (sym->section))
{
int slen = strlen ((char *) sym->name);
char *hash;
2005-04-21 15:45:39 +08:00
if (_bfd_vms_output_check (abfd, slen) < 0)
1999-05-03 15:29:11 +08:00
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_GBL,
-1);
hash = (_bfd_vms_length_hash_symbol
(abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_vms_output_counted (abfd, hash);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
else if (bfd_is_abs_section (sym->section))
{
if (_bfd_vms_output_check (abfd, 16) < 0)
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_QW,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_quad (abfd,
(uquad) sym->value);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_QW,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
else
{
if (_bfd_vms_output_check (abfd, 32) < 0)
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_PQ,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_long (abfd,
(unsigned long) (sec->index));
1999-05-03 15:29:11 +08:00
_bfd_vms_output_quad (abfd,
((uquad) (*rptr)->addend
+ (uquad) sym->value));
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_OFF,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
}
break;
case ALPHA_R_HINT:
{
int hint_size;
char *hash ATTRIBUTE_UNUSED;
1999-05-03 15:29:11 +08:00
hint_size = sptr->size;
sptr->size = len;
sto_imm (abfd, sptr, vaddr, section->index);
sptr->size = hint_size;
}
break;
case ALPHA_R_LINKAGE:
{
char *hash;
1999-05-03 15:29:11 +08:00
if (_bfd_vms_output_check (abfd, 64) < 0)
{
end_etir_record (abfd);
start_etir_record (abfd, section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STC_LP_PSB,
-1);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_long (abfd,
(unsigned long) PRIV (vms_linkage_index));
PRIV (vms_linkage_index) += 2;
hash = (_bfd_vms_length_hash_symbol
(abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_vms_output_counted (abfd, hash);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_byte (abfd, 0);
_bfd_vms_output_flush (abfd);
}
break;
case ALPHA_R_CODEADDR:
{
int slen = strlen ((char *) sym->name);
char *hash;
if (_bfd_vms_output_check (abfd, slen) < 0)
1999-05-03 15:29:11 +08:00
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
vaddr, FALSE);
1999-05-03 15:29:11 +08:00
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_CA,
-1);
hash = (_bfd_vms_length_hash_symbol
(abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_vms_output_counted (abfd, hash);
1999-05-03 15:29:11 +08:00
_bfd_vms_output_flush (abfd);
}
break;
default:
(*_bfd_error_handler) (_("Unhandled relocation %s"),
(*rptr)->howto->name);
break;
}
vaddr += len;
if (len == sptr->size)
{
break;
}
else
{
sptr->contents += len;
sptr->offset += len;
sptr->size -= len;
i--;
rptr++;
}
}
2005-04-21 15:45:39 +08:00
else
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* Sptr starts after reloc. */
i--;
/* Check next reloc. */
1999-05-03 15:29:11 +08:00
rptr++;
}
2005-04-21 15:45:39 +08:00
if (i == 0)
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* All reloc checked. */
1999-05-03 15:29:11 +08:00
if (sptr->size > 0)
{
2005-04-21 15:45:39 +08:00
/* Dump rest. */
sto_imm (abfd, sptr, vaddr, section->index);
1999-05-03 15:29:11 +08:00
vaddr += sptr->size;
}
break;
}
2005-04-21 15:45:39 +08:00
}
}
else
1999-05-03 15:29:11 +08:00
{
2005-04-21 15:45:39 +08:00
/* No relocs, just dump. */
1999-05-03 15:29:11 +08:00
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
}
sptr = sptr->next;
2005-04-21 15:45:39 +08:00
}
1999-05-03 15:29:11 +08:00
end_etir_record (abfd);
2005-04-21 15:45:39 +08:00
}
1999-05-03 15:29:11 +08:00
section = section->next;
}
_bfd_vms_output_alignment (abfd, 2);
1999-05-03 15:29:11 +08:00
return 0;
}
/* Write traceback data for bfd abfd. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_write_tbt (bfd * abfd ATTRIBUTE_UNUSED,
int objtype ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (2, "vms_write_tbt (%p, %d)\n", abfd, objtype);
#endif
return 0;
}
/* Write debug info for bfd abfd. */
1999-05-03 15:29:11 +08:00
int
2005-04-21 15:45:39 +08:00
_bfd_vms_write_dbg (bfd * abfd ATTRIBUTE_UNUSED,
int objtype ATTRIBUTE_UNUSED)
1999-05-03 15:29:11 +08:00
{
#if VMS_DEBUG
_bfd_vms_debug (2, "vms_write_dbg (%p, objtype)\n", abfd, objtype);
#endif
return 0;
}