From f6c2300b0a22f94e0716e90588596aebb39e8e5e Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 6 Dec 1993 08:53:53 +0000 Subject: [PATCH] * som.c (som_begin_writing): Flesh out code for handling simple auxiliary headers. (bfd_som_attach_aux_hdr): New function. * som.h (struct somdata): Add fields for attaching version and copyright headers. Add accessor macros. --- bfd/ChangeLog | 7 ++++ bfd/som.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 107 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index adc44d5216..08a1ef296d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,12 @@ Sun Dec 5 19:32:08 1993 Jeffrey A. Law (law@snake.cs.utah.edu) + * som.c (som_begin_writing): Flesh out code for handling simple + auxiliary headers. + (bfd_som_attach_aux_hdr): New function. + + * som.h (struct somdata): Add fields for attaching version and + copyright headers. Add accessor macros. + * som.c (R_DLT_REL, R_AUX_UNWIND, R_SEC_STMT): Add protected definitions for old versions of HPUX which fail to define them. (som_hppa_howto_talbe): Add R_DLT_REL, R_AUX_UNWIND, and R_SEC_STMT diff --git a/bfd/som.c b/bfd/som.c index d27b03bc8b..08ef81122e 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -2548,12 +2548,67 @@ som_begin_writing (abfd) current_offset += sizeof (struct header); /* Any auxiliary headers will follow the file header. Right now - we have no auxiliary headers, so current_offset does not change. */ + we support only the copyright and version headers. */ obj_som_file_hdr (abfd)->aux_header_location = current_offset; obj_som_file_hdr (abfd)->aux_header_size = 0; + if (obj_som_version_hdr (abfd) != NULL) + { + unsigned int len; - /* Next comes the initialization pointers; again we have no - initialization pointers, so current offset does not change. */ + bfd_seek (abfd, current_offset, SEEK_SET); + + /* Write the aux_id structure and the string length. */ + len = sizeof (struct aux_id) + sizeof (unsigned int); + obj_som_file_hdr (abfd)->aux_header_size += len; + current_offset += len; + if (bfd_write ((PTR) obj_som_version_hdr (abfd), len, 1, abfd) != len) + { + bfd_error = system_call_error; + return false; + } + + /* Write the version string. */ + len = obj_som_version_hdr (abfd)->string_length; + obj_som_file_hdr (abfd)->aux_header_size += len; + current_offset += len; + if (bfd_write ((PTR) obj_som_version_hdr (abfd)->user_string, + len, 1, abfd) != len) + { + bfd_error = system_call_error; + return false; + } + } + + if (obj_som_copyright_hdr (abfd) != NULL) + { + unsigned int len; + + bfd_seek (abfd, current_offset, SEEK_SET); + + /* Write the aux_id structure and the string length. */ + len = sizeof (struct aux_id) + sizeof (unsigned int); + obj_som_file_hdr (abfd)->aux_header_size += len; + current_offset += len; + if (bfd_write ((PTR) obj_som_copyright_hdr (abfd), len, 1, abfd) != len) + { + bfd_error = system_call_error; + return false; + } + + /* Write the copyright string. */ + len = obj_som_copyright_hdr (abfd)->string_length; + obj_som_file_hdr (abfd)->aux_header_size += len; + current_offset += len; + if (bfd_write ((PTR) obj_som_copyright_hdr (abfd)->copyright, + len, 1, abfd) != len) + { + bfd_error = system_call_error; + return false; + } + } + + /* Next comes the initialization pointers; we have no initialization + pointers, so current offset does not change. */ obj_som_file_hdr (abfd)->init_array_location = current_offset; obj_som_file_hdr (abfd)->init_array_total = 0; @@ -3870,6 +3925,48 @@ bfd_som_attach_unwind_info (symbol, unwind_desc) (*som_symbol_data (symbol))->unwind = unwind_desc; } +/* Attach an auxiliary header to the BFD backend so that it may be + written into the object file. */ +void +bfd_som_attach_aux_hdr (abfd, type, string) + bfd *abfd; + int type; + char *string; +{ + if (type == VERSION_AUX_ID) + { + int len = strlen (string); + + if (len % 4) + len += (4 - (len % 4)); + obj_som_version_hdr (abfd) + = bfd_zalloc (abfd, + sizeof (struct aux_id) + sizeof (unsigned int) + len); + obj_som_version_hdr (abfd)->header_id.type = VERSION_AUX_ID; + obj_som_version_hdr (abfd)->header_id.length + = sizeof (struct aux_id) + sizeof (unsigned int) + len; + obj_som_version_hdr (abfd)->string_length = len; + strcpy (obj_som_version_hdr (abfd)->user_string, string); + } + else if (type == COPYRIGHT_AUX_ID) + { + int len = strlen (string); + + if (len % 4) + len += (4 - (len % 4)); + obj_som_copyright_hdr (abfd) + = bfd_zalloc (abfd, + sizeof (struct aux_id) + sizeof (unsigned int) + len); + obj_som_copyright_hdr (abfd)->header_id.type = COPYRIGHT_AUX_ID; + obj_som_version_hdr (abfd)->header_id.length + = sizeof (struct aux_id) + sizeof (unsigned int) + len; + obj_som_copyright_hdr (abfd)->string_length = len; + strcpy (obj_som_copyright_hdr (abfd)->copyright, string); + } + else + abort (); +} + static boolean som_set_section_contents (abfd, section, location, offset, count) bfd *abfd;