diff options
author | Jeff Law <law@redhat.com> | 1994-09-14 00:29:11 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1994-09-14 00:29:11 +0000 |
commit | a0b4aa626512b2d255470691273fd2cc93d22b35 (patch) | |
tree | bd9287e50ff6dc741f5ec00dbf59d2da487fb79d /bfd/som.c | |
parent | c9e7a4b46f3e4aaad7efdb3749fce60e6d2d1c97 (diff) | |
download | gdb-a0b4aa626512b2d255470691273fd2cc93d22b35.zip gdb-a0b4aa626512b2d255470691273fd2cc93d22b35.tar.gz gdb-a0b4aa626512b2d255470691273fd2cc93d22b35.tar.bz2 |
* som.c (som_object_setup): Handle exec_entry and exec_flags being
switched in executables created by the OSF1 linker.
(som_write_fixups): Handle R_EXIT just like the R_{F,L,R}SEL
fixups. Support R_ALT_ENTRY (handle just like R_EXIT).
Diffstat (limited to 'bfd/som.c')
-rw-r--r-- | bfd/som.c | 46 |
1 files changed, 29 insertions, 17 deletions
@@ -1605,7 +1605,31 @@ som_object_setup (abfd, file_hdrp, aux_hdrp) break; } - bfd_get_start_address (abfd) = aux_hdrp->exec_entry; + /* Allocate space to hold the saved exec header information. */ + obj_som_exec_data (abfd) = (struct som_exec_data *) + bfd_zalloc (abfd, sizeof (struct som_exec_data )); + if (obj_som_exec_data (abfd) == NULL) + { + bfd_set_error (bfd_error_no_memory); + return NULL; + } + + /* The braindamaged OSF1 linker switched exec_flags and exec_entry! + + It seems rather backward that the OSF1 linker which is much + older than any HPUX linker I've got uses a newer SOM version + id... But that's what I've found by experimentation. */ + if (file_hdrp->version_id == NEW_VERSION_ID) + { + bfd_get_start_address (abfd) = aux_hdrp->exec_flags; + obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_entry; + } + else + { + bfd_get_start_address (abfd) = aux_hdrp->exec_entry; + obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_flags; + } + bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 0); bfd_get_symcount (abfd) = file_hdrp->symbol_total; @@ -1618,17 +1642,8 @@ som_object_setup (abfd, file_hdrp, aux_hdrp) obj_som_sym_filepos (abfd) = file_hdrp->symbol_location; obj_som_str_filepos (abfd) = file_hdrp->symbol_strings_location; obj_som_reloc_filepos (abfd) = file_hdrp->fixup_request_location; - - obj_som_exec_data (abfd) = (struct som_exec_data *) - bfd_zalloc (abfd, sizeof (struct som_exec_data )); - if (obj_som_exec_data (abfd) == NULL) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } - obj_som_exec_data (abfd)->system_id = file_hdrp->system_id; - obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_flags; + return abfd->xvec; } @@ -2434,6 +2449,7 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep) /* This only needs to handle relocations that may be made by hppa_som_gen_reloc. */ case R_ENTRY: + case R_ALT_ENTRY: case R_EXIT: case R_N_MODE: case R_S_MODE: @@ -2545,12 +2561,6 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep) break; } - case R_EXIT: - bfd_put_8 (abfd, R_EXIT, p); - subspace_reloc_size += 1; - p += 1; - break; - case R_N_MODE: case R_S_MODE: case R_D_MODE: @@ -2566,6 +2576,8 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep) } break; + case R_EXIT: + case R_ALT_ENTRY: case R_FSEL: case R_LSEL: case R_RSEL: |