X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Flibbfd.c;h=b43e88ca28085c51127940d9ce0682551be69b61;hb=0bff3f4bb6e2ad90568897c3a233919f9b6bf51a;hp=8abd1f58f1cb1bef428c896e93902c24e11f2d60;hpb=252b5132c753830d5fd56823373aed85f2a0db63;p=binutils-gdb.git diff --git a/bfd/libbfd.c b/bfd/libbfd.c index 8abd1f58f1c..b43e88ca280 100644 --- a/bfd/libbfd.c +++ b/bfd/libbfd.c @@ -1,5 +1,5 @@ /* Assorted BFD support routines, only used internally. - Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998 + Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. Written by Cygnus Support. @@ -45,7 +45,7 @@ DESCRIPTION /*ARGSUSED*/ boolean bfd_false (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_invalid_operation); return false; @@ -57,7 +57,7 @@ bfd_false (ignore) /*ARGSUSED*/ boolean bfd_true (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { return true; } @@ -68,7 +68,7 @@ bfd_true (ignore) /*ARGSUSED*/ PTR bfd_nullvoidptr (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_invalid_operation); return NULL; @@ -77,7 +77,7 @@ bfd_nullvoidptr (ignore) /*ARGSUSED*/ int bfd_0 (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { return 0; } @@ -85,7 +85,7 @@ bfd_0 (ignore) /*ARGSUSED*/ unsigned int bfd_0u (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { return 0; } @@ -93,7 +93,7 @@ bfd_0u (ignore) /*ARGUSED*/ long bfd_0l (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { return 0; } @@ -104,7 +104,7 @@ bfd_0l (ignore) /*ARGSUSED*/ long _bfd_n1 (ignore_abfd) - bfd *ignore_abfd; + bfd *ignore_abfd ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_invalid_operation); return -1; @@ -113,15 +113,15 @@ _bfd_n1 (ignore_abfd) /*ARGSUSED*/ void bfd_void (ignore) - bfd *ignore; + bfd *ignore ATTRIBUTE_UNUSED; { } /*ARGSUSED*/ boolean _bfd_nocore_core_file_matches_executable_p (ignore_core_bfd, ignore_exec_bfd) - bfd *ignore_core_bfd; - bfd *ignore_exec_bfd; + bfd *ignore_core_bfd ATTRIBUTE_UNUSED; + bfd *ignore_exec_bfd ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_invalid_operation); return false; @@ -133,7 +133,7 @@ _bfd_nocore_core_file_matches_executable_p (ignore_core_bfd, ignore_exec_bfd) /*ARGSUSED*/ char * _bfd_nocore_core_file_failing_command (ignore_abfd) - bfd *ignore_abfd; + bfd *ignore_abfd ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_invalid_operation); return (char *)NULL; @@ -145,7 +145,7 @@ _bfd_nocore_core_file_failing_command (ignore_abfd) /*ARGSUSED*/ int _bfd_nocore_core_file_failing_signal (ignore_abfd) - bfd *ignore_abfd; + bfd *ignore_abfd ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_invalid_operation); return 0; @@ -154,7 +154,7 @@ _bfd_nocore_core_file_failing_signal (ignore_abfd) /*ARGSUSED*/ const bfd_target * _bfd_dummy_target (ignore_abfd) - bfd *ignore_abfd; + bfd *ignore_abfd ATTRIBUTE_UNUSED; { bfd_set_error (bfd_error_wrong_format); return 0; @@ -293,7 +293,7 @@ bfd_read (ptr, size, nitems, abfd) A BFD backend may wish to override bfd_error_file_truncated to provide something more useful (eg. no_symbols or wrong_format). */ - if (nread < (int)(size * nitems)) + if (nread != (int) (size * nitems)) { if (ferror (bfd_cache_lookup (abfd))) bfd_set_error (bfd_error_system_call); @@ -792,7 +792,7 @@ DESCRIPTION .{* Byte swapping macros for user section data. *} . .#define bfd_put_8(abfd, val, ptr) \ -. (*((unsigned char *)(ptr)) = (unsigned char)(val)) +. ((void) (*((unsigned char *)(ptr)) = (unsigned char)(val))) .#define bfd_put_signed_8 \ . bfd_put_8 .#define bfd_get_8(abfd, ptr) \ @@ -827,6 +827,20 @@ DESCRIPTION .#define bfd_get_signed_64(abfd, ptr) \ . BFD_SEND(abfd, bfd_getx_signed_64, (ptr)) . +.#define bfd_get(bits, abfd, ptr) \ +. ((bits) == 8 ? bfd_get_8 (abfd, ptr) \ +. : (bits) == 16 ? bfd_get_16 (abfd, ptr) \ +. : (bits) == 32 ? bfd_get_32 (abfd, ptr) \ +. : (bits) == 64 ? bfd_get_64 (abfd, ptr) \ +. : (abort (), (bfd_vma) - 1)) +. +.#define bfd_put(bits, abfd, val, ptr) \ +. ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \ +. : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \ +. : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \ +. : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \ +. : (abort (), (void) 0)) +. */ /* @@ -989,7 +1003,7 @@ bfd_getl_signed_32 (addr) bfd_vma bfd_getb64 (addr) - register const bfd_byte *addr; + register const bfd_byte *addr ATTRIBUTE_UNUSED; { #ifdef BFD64 bfd_vma low, high; @@ -1013,7 +1027,7 @@ bfd_getb64 (addr) bfd_vma bfd_getl64 (addr) - register const bfd_byte *addr; + register const bfd_byte *addr ATTRIBUTE_UNUSED; { #ifdef BFD64 bfd_vma low, high; @@ -1037,7 +1051,7 @@ bfd_getl64 (addr) bfd_signed_vma bfd_getb_signed_64 (addr) - register const bfd_byte *addr; + register const bfd_byte *addr ATTRIBUTE_UNUSED; { #ifdef BFD64 bfd_vma low, high; @@ -1061,7 +1075,7 @@ bfd_getb_signed_64 (addr) bfd_signed_vma bfd_getl_signed_64 (addr) - register const bfd_byte *addr; + register const bfd_byte *addr ATTRIBUTE_UNUSED; { #ifdef BFD64 bfd_vma low, high; @@ -1106,8 +1120,8 @@ bfd_putl32 (data, addr) void bfd_putb64 (data, addr) - bfd_vma data; - register bfd_byte *addr; + bfd_vma data ATTRIBUTE_UNUSED; + register bfd_byte *addr ATTRIBUTE_UNUSED; { #ifdef BFD64 addr[0] = (bfd_byte)(data >> (7*8)); @@ -1125,8 +1139,8 @@ bfd_putb64 (data, addr) void bfd_putl64 (data, addr) - bfd_vma data; - register bfd_byte *addr; + bfd_vma data ATTRIBUTE_UNUSED; + register bfd_byte *addr ATTRIBUTE_UNUSED; { #ifdef BFD64 addr[7] = (bfd_byte)(data >> (7*8)); @@ -1152,22 +1166,29 @@ _bfd_generic_get_section_contents (abfd, section, location, offset, count) file_ptr offset; bfd_size_type count; { - if (count == 0) - return true; - if ((bfd_size_type)(offset+count) > section->_raw_size - || bfd_seek(abfd, (file_ptr)(section->filepos + offset), SEEK_SET) == -1 - || bfd_read(location, (bfd_size_type)1, count, abfd) != count) - return (false); /* on error */ - return (true); + if (count == 0) + return true; + + if ((bfd_size_type) (offset + count) > section->_raw_size) + { + bfd_set_error (bfd_error_invalid_operation); + return false; + } + + if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0 + || bfd_read (location, (bfd_size_type) 1, count, abfd) != count) + return false; + + return true; } boolean _bfd_generic_get_section_contents_in_window (abfd, section, w, offset, count) - bfd *abfd; - sec_ptr section; - bfd_window *w; - file_ptr offset; - bfd_size_type count; + bfd *abfd ATTRIBUTE_UNUSED; + sec_ptr section ATTRIBUTE_UNUSED; + bfd_window *w ATTRIBUTE_UNUSED; + file_ptr offset ATTRIBUTE_UNUSED; + bfd_size_type count ATTRIBUTE_UNUSED; { #ifdef USE_MMAP if (count == 0) @@ -1246,7 +1267,7 @@ bfd_log2 (x) { unsigned int result = 0; - while ((((bfd_vma) 1) << result) < x) + while ((x = (x >> 1)) != 0) ++result; return result; } @@ -1261,3 +1282,26 @@ bfd_generic_is_local_label_name (abfd, name) return (name[0] == locals_prefix); } +/* Can be used from / for bfd_merge_private_bfd_data to check that + endianness matches between input and output file. Returns + true for a match, otherwise returns false and emits an error. */ +boolean +_bfd_generic_verify_endian_match (ibfd, obfd) + bfd *ibfd; + bfd *obfd; +{ + if (ibfd->xvec->byteorder != obfd->xvec->byteorder + && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN) + { + (*_bfd_error_handler) + ("%s: compiled for a %s endian system and target is %s endian", + bfd_get_filename (ibfd), + bfd_big_endian (ibfd) ? "big" : "little", + bfd_big_endian (obfd) ? "big" : "little"); + + bfd_set_error (bfd_error_wrong_format); + return false; + } + + return true; +}