xref: /openbsd-src/gnu/usr.bin/binutils/bfd/libbfd.c (revision 007c2a4539b8b8aaa95c5e73e77620090abe113b)
12159047fSniklas /* Assorted BFD support routines, only used internally.
2b55d4692Sfgsch    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3*007c2a45Smiod    2000, 2001, 2002, 2003, 2004
4b305b0f1Sespie    Free Software Foundation, Inc.
52159047fSniklas    Written by Cygnus Support.
62159047fSniklas 
72159047fSniklas    This file is part of BFD, the Binary File Descriptor library.
82159047fSniklas 
92159047fSniklas    This program is free software; you can redistribute it and/or modify
102159047fSniklas    it under the terms of the GNU General Public License as published by
112159047fSniklas    the Free Software Foundation; either version 2 of the License, or
122159047fSniklas    (at your option) any later version.
132159047fSniklas 
142159047fSniklas    This program is distributed in the hope that it will be useful,
152159047fSniklas    but WITHOUT ANY WARRANTY; without even the implied warranty of
162159047fSniklas    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
172159047fSniklas    GNU General Public License for more details.
182159047fSniklas 
192159047fSniklas    You should have received a copy of the GNU General Public License
202159047fSniklas    along with this program; if not, write to the Free Software
212159047fSniklas    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
222159047fSniklas 
232159047fSniklas #include "bfd.h"
242159047fSniklas #include "sysdep.h"
252159047fSniklas #include "libbfd.h"
262159047fSniklas 
270c6d0228Sniklas #ifndef HAVE_GETPAGESIZE
280c6d0228Sniklas #define getpagesize() 2048
290c6d0228Sniklas #endif
300c6d0228Sniklas 
312159047fSniklas /*
322159047fSniklas SECTION
332159047fSniklas 	Internal functions
342159047fSniklas 
352159047fSniklas DESCRIPTION
362159047fSniklas 	These routines are used within BFD.
372159047fSniklas 	They are not intended for export, but are documented here for
382159047fSniklas 	completeness.
392159047fSniklas */
402159047fSniklas 
412159047fSniklas /* A routine which is used in target vectors for unsupported
422159047fSniklas    operations.  */
432159047fSniklas 
44c074d1c9Sdrahn bfd_boolean
bfd_false(bfd * ignore ATTRIBUTE_UNUSED)45*007c2a45Smiod bfd_false (bfd *ignore ATTRIBUTE_UNUSED)
462159047fSniklas {
472159047fSniklas   bfd_set_error (bfd_error_invalid_operation);
48c074d1c9Sdrahn   return FALSE;
492159047fSniklas }
502159047fSniklas 
512159047fSniklas /* A routine which is used in target vectors for supported operations
522159047fSniklas    which do not actually do anything.  */
532159047fSniklas 
54c074d1c9Sdrahn bfd_boolean
bfd_true(bfd * ignore ATTRIBUTE_UNUSED)55*007c2a45Smiod bfd_true (bfd *ignore ATTRIBUTE_UNUSED)
562159047fSniklas {
57c074d1c9Sdrahn   return TRUE;
582159047fSniklas }
592159047fSniklas 
602159047fSniklas /* A routine which is used in target vectors for unsupported
612159047fSniklas    operations which return a pointer value.  */
622159047fSniklas 
63*007c2a45Smiod void *
bfd_nullvoidptr(bfd * ignore ATTRIBUTE_UNUSED)64*007c2a45Smiod bfd_nullvoidptr (bfd *ignore ATTRIBUTE_UNUSED)
652159047fSniklas {
662159047fSniklas   bfd_set_error (bfd_error_invalid_operation);
672159047fSniklas   return NULL;
682159047fSniklas }
692159047fSniklas 
702159047fSniklas int
bfd_0(bfd * ignore ATTRIBUTE_UNUSED)71*007c2a45Smiod bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
722159047fSniklas {
732159047fSniklas   return 0;
742159047fSniklas }
752159047fSniklas 
762159047fSniklas unsigned int
bfd_0u(bfd * ignore ATTRIBUTE_UNUSED)77*007c2a45Smiod bfd_0u (bfd *ignore ATTRIBUTE_UNUSED)
782159047fSniklas {
792159047fSniklas    return 0;
802159047fSniklas }
812159047fSniklas 
822159047fSniklas long
bfd_0l(bfd * ignore ATTRIBUTE_UNUSED)83*007c2a45Smiod bfd_0l (bfd *ignore ATTRIBUTE_UNUSED)
842159047fSniklas {
852159047fSniklas   return 0;
862159047fSniklas }
872159047fSniklas 
882159047fSniklas /* A routine which is used in target vectors for unsupported
892159047fSniklas    operations which return -1 on error.  */
902159047fSniklas 
912159047fSniklas long
_bfd_n1(bfd * ignore_abfd ATTRIBUTE_UNUSED)92*007c2a45Smiod _bfd_n1 (bfd *ignore_abfd ATTRIBUTE_UNUSED)
932159047fSniklas {
942159047fSniklas   bfd_set_error (bfd_error_invalid_operation);
952159047fSniklas   return -1;
962159047fSniklas }
972159047fSniklas 
982159047fSniklas void
bfd_void(bfd * ignore ATTRIBUTE_UNUSED)99*007c2a45Smiod bfd_void (bfd *ignore ATTRIBUTE_UNUSED)
1002159047fSniklas {
1012159047fSniklas }
1022159047fSniklas 
103c074d1c9Sdrahn bfd_boolean
_bfd_nocore_core_file_matches_executable_p(bfd * ignore_core_bfd ATTRIBUTE_UNUSED,bfd * ignore_exec_bfd ATTRIBUTE_UNUSED)104*007c2a45Smiod _bfd_nocore_core_file_matches_executable_p
105*007c2a45Smiod   (bfd *ignore_core_bfd ATTRIBUTE_UNUSED,
106*007c2a45Smiod    bfd *ignore_exec_bfd ATTRIBUTE_UNUSED)
1072159047fSniklas {
1082159047fSniklas   bfd_set_error (bfd_error_invalid_operation);
109c074d1c9Sdrahn   return FALSE;
1102159047fSniklas }
1112159047fSniklas 
1122159047fSniklas /* Routine to handle core_file_failing_command entry point for targets
1132159047fSniklas    without core file support.  */
1142159047fSniklas 
1152159047fSniklas char *
_bfd_nocore_core_file_failing_command(bfd * ignore_abfd ATTRIBUTE_UNUSED)116*007c2a45Smiod _bfd_nocore_core_file_failing_command (bfd *ignore_abfd ATTRIBUTE_UNUSED)
1172159047fSniklas {
1182159047fSniklas   bfd_set_error (bfd_error_invalid_operation);
119*007c2a45Smiod   return NULL;
1202159047fSniklas }
1212159047fSniklas 
1222159047fSniklas /* Routine to handle core_file_failing_signal entry point for targets
1232159047fSniklas    without core file support.  */
1242159047fSniklas 
1252159047fSniklas int
_bfd_nocore_core_file_failing_signal(bfd * ignore_abfd ATTRIBUTE_UNUSED)126*007c2a45Smiod _bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED)
1272159047fSniklas {
1282159047fSniklas   bfd_set_error (bfd_error_invalid_operation);
1292159047fSniklas   return 0;
1302159047fSniklas }
1312159047fSniklas 
1322159047fSniklas const bfd_target *
_bfd_dummy_target(bfd * ignore_abfd ATTRIBUTE_UNUSED)133*007c2a45Smiod _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED)
1342159047fSniklas {
1352159047fSniklas   bfd_set_error (bfd_error_wrong_format);
1362159047fSniklas   return 0;
1372159047fSniklas }
1382159047fSniklas 
139c88b1d6cSniklas /* Allocate memory using malloc.  */
1402159047fSniklas 
141*007c2a45Smiod void *
bfd_malloc(bfd_size_type size)142*007c2a45Smiod bfd_malloc (bfd_size_type size)
1432159047fSniklas {
144*007c2a45Smiod   void *ptr;
1452159047fSniklas 
146c074d1c9Sdrahn   if (size != (size_t) size)
147c074d1c9Sdrahn     {
148c88b1d6cSniklas       bfd_set_error (bfd_error_no_memory);
149c074d1c9Sdrahn       return NULL;
150c074d1c9Sdrahn     }
151c074d1c9Sdrahn 
152*007c2a45Smiod   ptr = malloc ((size_t) size);
153c074d1c9Sdrahn   if (ptr == NULL && (size_t) size != 0)
154c074d1c9Sdrahn     bfd_set_error (bfd_error_no_memory);
155c074d1c9Sdrahn 
156c88b1d6cSniklas   return ptr;
157c88b1d6cSniklas }
158c88b1d6cSniklas 
159c88b1d6cSniklas /* Reallocate memory using realloc.  */
160c88b1d6cSniklas 
161*007c2a45Smiod void *
bfd_realloc(void * ptr,bfd_size_type size)162*007c2a45Smiod bfd_realloc (void *ptr, bfd_size_type size)
163c88b1d6cSniklas {
164*007c2a45Smiod   void *ret;
165c88b1d6cSniklas 
166c074d1c9Sdrahn   if (size != (size_t) size)
167c074d1c9Sdrahn     {
168c074d1c9Sdrahn       bfd_set_error (bfd_error_no_memory);
169c074d1c9Sdrahn       return NULL;
170c074d1c9Sdrahn     }
171c88b1d6cSniklas 
172c074d1c9Sdrahn   if (ptr == NULL)
173*007c2a45Smiod     ret = malloc ((size_t) size);
174c074d1c9Sdrahn   else
175*007c2a45Smiod     ret = realloc (ptr, (size_t) size);
176c074d1c9Sdrahn 
177c074d1c9Sdrahn   if (ret == NULL && (size_t) size != 0)
178c88b1d6cSniklas     bfd_set_error (bfd_error_no_memory);
179c88b1d6cSniklas 
180c88b1d6cSniklas   return ret;
181c88b1d6cSniklas }
182c88b1d6cSniklas 
183c88b1d6cSniklas /* Allocate memory using malloc and clear it.  */
184c88b1d6cSniklas 
185*007c2a45Smiod void *
bfd_zmalloc(bfd_size_type size)186*007c2a45Smiod bfd_zmalloc (bfd_size_type size)
187c88b1d6cSniklas {
188*007c2a45Smiod   void *ptr;
189c88b1d6cSniklas 
190c074d1c9Sdrahn   if (size != (size_t) size)
191c074d1c9Sdrahn     {
192c074d1c9Sdrahn       bfd_set_error (bfd_error_no_memory);
193c074d1c9Sdrahn       return NULL;
194c074d1c9Sdrahn     }
195c88b1d6cSniklas 
196*007c2a45Smiod   ptr = malloc ((size_t) size);
197c074d1c9Sdrahn 
198c074d1c9Sdrahn   if ((size_t) size != 0)
199c88b1d6cSniklas     {
200c88b1d6cSniklas       if (ptr == NULL)
201c88b1d6cSniklas 	bfd_set_error (bfd_error_no_memory);
202c88b1d6cSniklas       else
203c074d1c9Sdrahn 	memset (ptr, 0, (size_t) size);
204c88b1d6cSniklas     }
2052159047fSniklas 
2062159047fSniklas   return ptr;
2072159047fSniklas }
2082159047fSniklas /*
2092159047fSniklas INTERNAL_FUNCTION
2102159047fSniklas 	bfd_write_bigendian_4byte_int
2112159047fSniklas 
2122159047fSniklas SYNOPSIS
213c074d1c9Sdrahn 	bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
2142159047fSniklas 
2152159047fSniklas DESCRIPTION
2162159047fSniklas 	Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
2172159047fSniklas 	endian order regardless of what else is going on.  This is useful in
2182159047fSniklas 	archives.
2192159047fSniklas 
2202159047fSniklas */
221c074d1c9Sdrahn bfd_boolean
bfd_write_bigendian_4byte_int(bfd * abfd,unsigned int i)222*007c2a45Smiod bfd_write_bigendian_4byte_int (bfd *abfd, unsigned int i)
2232159047fSniklas {
2242159047fSniklas   bfd_byte buffer[4];
225c074d1c9Sdrahn   bfd_putb32 ((bfd_vma) i, buffer);
226*007c2a45Smiod   return bfd_bwrite (buffer, (bfd_size_type) 4, abfd) == 4;
2272159047fSniklas }
2282159047fSniklas 
2292159047fSniklas 
2302159047fSniklas /** The do-it-yourself (byte) sex-change kit */
2312159047fSniklas 
2322159047fSniklas /* The middle letter e.g. get<b>short indicates Big or Little endian
2332159047fSniklas    target machine.  It doesn't matter what the byte order of the host
2342159047fSniklas    machine is; these routines work for either.  */
2352159047fSniklas 
2362159047fSniklas /* FIXME: Should these take a count argument?
2372159047fSniklas    Answer (gnu@cygnus.com):  No, but perhaps they should be inline
2382159047fSniklas                              functions in swap.h #ifdef __GNUC__.
2392159047fSniklas                              Gprof them later and find out.  */
2402159047fSniklas 
2412159047fSniklas /*
2422159047fSniklas FUNCTION
2432159047fSniklas 	bfd_put_size
2442159047fSniklas FUNCTION
2452159047fSniklas 	bfd_get_size
2462159047fSniklas 
2472159047fSniklas DESCRIPTION
2482159047fSniklas 	These macros as used for reading and writing raw data in
2492159047fSniklas 	sections; each access (except for bytes) is vectored through
2502159047fSniklas 	the target format of the BFD and mangled accordingly. The
2512159047fSniklas 	mangling performs any necessary endian translations and
2522159047fSniklas 	removes alignment restrictions.  Note that types accepted and
2532159047fSniklas 	returned by these macros are identical so they can be swapped
2542159047fSniklas 	around in macros---for example, @file{libaout.h} defines <<GET_WORD>>
2552159047fSniklas 	to either <<bfd_get_32>> or <<bfd_get_64>>.
2562159047fSniklas 
2572159047fSniklas 	In the put routines, @var{val} must be a <<bfd_vma>>.  If we are on a
2582159047fSniklas 	system without prototypes, the caller is responsible for making
2592159047fSniklas 	sure that is true, with a cast if necessary.  We don't cast
2602159047fSniklas 	them in the macro definitions because that would prevent <<lint>>
2612159047fSniklas 	or <<gcc -Wall>> from detecting sins such as passing a pointer.
2622159047fSniklas 	To detect calling these with less than a <<bfd_vma>>, use
2632159047fSniklas 	<<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s.
2642159047fSniklas 
2652159047fSniklas .
2662159047fSniklas .{* Byte swapping macros for user section data.  *}
2672159047fSniklas .
2682159047fSniklas .#define bfd_put_8(abfd, val, ptr) \
269*007c2a45Smiod .  ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
2702159047fSniklas .#define bfd_put_signed_8 \
2712159047fSniklas .  bfd_put_8
2722159047fSniklas .#define bfd_get_8(abfd, ptr) \
273c074d1c9Sdrahn .  (*(unsigned char *) (ptr) & 0xff)
2742159047fSniklas .#define bfd_get_signed_8(abfd, ptr) \
275c074d1c9Sdrahn .  (((*(unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
2762159047fSniklas .
2772159047fSniklas .#define bfd_put_16(abfd, val, ptr) \
2782159047fSniklas .  BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
2792159047fSniklas .#define bfd_put_signed_16 \
2802159047fSniklas .  bfd_put_16
2812159047fSniklas .#define bfd_get_16(abfd, ptr) \
2822159047fSniklas .  BFD_SEND (abfd, bfd_getx16, (ptr))
2832159047fSniklas .#define bfd_get_signed_16(abfd, ptr) \
2842159047fSniklas .  BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
2852159047fSniklas .
2862159047fSniklas .#define bfd_put_32(abfd, val, ptr) \
2872159047fSniklas .  BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
2882159047fSniklas .#define bfd_put_signed_32 \
2892159047fSniklas .  bfd_put_32
2902159047fSniklas .#define bfd_get_32(abfd, ptr) \
2912159047fSniklas .  BFD_SEND (abfd, bfd_getx32, (ptr))
2922159047fSniklas .#define bfd_get_signed_32(abfd, ptr) \
2932159047fSniklas .  BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
2942159047fSniklas .
2952159047fSniklas .#define bfd_put_64(abfd, val, ptr) \
2962159047fSniklas .  BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
2972159047fSniklas .#define bfd_put_signed_64 \
2982159047fSniklas .  bfd_put_64
2992159047fSniklas .#define bfd_get_64(abfd, ptr) \
3002159047fSniklas .  BFD_SEND (abfd, bfd_getx64, (ptr))
3012159047fSniklas .#define bfd_get_signed_64(abfd, ptr) \
3022159047fSniklas .  BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
3032159047fSniklas .
304b305b0f1Sespie .#define bfd_get(bits, abfd, ptr)			\
305c074d1c9Sdrahn .  ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr)	\
306b305b0f1Sespie .   : (bits) == 16 ? bfd_get_16 (abfd, ptr)		\
307b305b0f1Sespie .   : (bits) == 32 ? bfd_get_32 (abfd, ptr)		\
308b305b0f1Sespie .   : (bits) == 64 ? bfd_get_64 (abfd, ptr)		\
309b305b0f1Sespie .   : (abort (), (bfd_vma) - 1))
310b305b0f1Sespie .
311b305b0f1Sespie .#define bfd_put(bits, abfd, val, ptr)			\
312b305b0f1Sespie .  ((bits) == 8 ? bfd_put_8  (abfd, val, ptr)		\
313b305b0f1Sespie .   : (bits) == 16 ? bfd_put_16 (abfd, val, ptr)		\
314b305b0f1Sespie .   : (bits) == 32 ? bfd_put_32 (abfd, val, ptr)		\
315b305b0f1Sespie .   : (bits) == 64 ? bfd_put_64 (abfd, val, ptr)		\
316b305b0f1Sespie .   : (abort (), (void) 0))
317b305b0f1Sespie .
3182159047fSniklas */
3192159047fSniklas 
3202159047fSniklas /*
3212159047fSniklas FUNCTION
3222159047fSniklas 	bfd_h_put_size
3232159047fSniklas 	bfd_h_get_size
3242159047fSniklas 
3252159047fSniklas DESCRIPTION
3262159047fSniklas 	These macros have the same function as their <<bfd_get_x>>
327c074d1c9Sdrahn 	brethren, except that they are used for removing information
3282159047fSniklas 	for the header records of object files. Believe it or not,
3292159047fSniklas 	some object files keep their header records in big endian
3302159047fSniklas 	order and their data in little endian order.
3312159047fSniklas .
3322159047fSniklas .{* Byte swapping macros for file header data.  *}
3332159047fSniklas .
3342159047fSniklas .#define bfd_h_put_8(abfd, val, ptr) \
3352159047fSniklas .  bfd_put_8 (abfd, val, ptr)
3362159047fSniklas .#define bfd_h_put_signed_8(abfd, val, ptr) \
3372159047fSniklas .  bfd_put_8 (abfd, val, ptr)
3382159047fSniklas .#define bfd_h_get_8(abfd, ptr) \
3392159047fSniklas .  bfd_get_8 (abfd, ptr)
3402159047fSniklas .#define bfd_h_get_signed_8(abfd, ptr) \
3412159047fSniklas .  bfd_get_signed_8 (abfd, ptr)
3422159047fSniklas .
3432159047fSniklas .#define bfd_h_put_16(abfd, val, ptr) \
3442159047fSniklas .  BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
3452159047fSniklas .#define bfd_h_put_signed_16 \
3462159047fSniklas .  bfd_h_put_16
3472159047fSniklas .#define bfd_h_get_16(abfd, ptr) \
3482159047fSniklas .  BFD_SEND (abfd, bfd_h_getx16, (ptr))
3492159047fSniklas .#define bfd_h_get_signed_16(abfd, ptr) \
3502159047fSniklas .  BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
3512159047fSniklas .
3522159047fSniklas .#define bfd_h_put_32(abfd, val, ptr) \
3532159047fSniklas .  BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
3542159047fSniklas .#define bfd_h_put_signed_32 \
3552159047fSniklas .  bfd_h_put_32
3562159047fSniklas .#define bfd_h_get_32(abfd, ptr) \
3572159047fSniklas .  BFD_SEND (abfd, bfd_h_getx32, (ptr))
3582159047fSniklas .#define bfd_h_get_signed_32(abfd, ptr) \
3592159047fSniklas .  BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
3602159047fSniklas .
3612159047fSniklas .#define bfd_h_put_64(abfd, val, ptr) \
3622159047fSniklas .  BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
3632159047fSniklas .#define bfd_h_put_signed_64 \
3642159047fSniklas .  bfd_h_put_64
3652159047fSniklas .#define bfd_h_get_64(abfd, ptr) \
3662159047fSniklas .  BFD_SEND (abfd, bfd_h_getx64, (ptr))
3672159047fSniklas .#define bfd_h_get_signed_64(abfd, ptr) \
3682159047fSniklas .  BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
3692159047fSniklas .
370*007c2a45Smiod .{* Aliases for the above, which should eventually go away.  *}
371c074d1c9Sdrahn .
372*007c2a45Smiod .#define H_PUT_64  bfd_h_put_64
373*007c2a45Smiod .#define H_PUT_32  bfd_h_put_32
374*007c2a45Smiod .#define H_PUT_16  bfd_h_put_16
375c074d1c9Sdrahn .#define H_PUT_8   bfd_h_put_8
376*007c2a45Smiod .#define H_PUT_S64 bfd_h_put_signed_64
377*007c2a45Smiod .#define H_PUT_S32 bfd_h_put_signed_32
378*007c2a45Smiod .#define H_PUT_S16 bfd_h_put_signed_16
379c074d1c9Sdrahn .#define H_PUT_S8  bfd_h_put_signed_8
380*007c2a45Smiod .#define H_GET_64  bfd_h_get_64
381*007c2a45Smiod .#define H_GET_32  bfd_h_get_32
382*007c2a45Smiod .#define H_GET_16  bfd_h_get_16
383c074d1c9Sdrahn .#define H_GET_8   bfd_h_get_8
384*007c2a45Smiod .#define H_GET_S64 bfd_h_get_signed_64
385*007c2a45Smiod .#define H_GET_S32 bfd_h_get_signed_32
386*007c2a45Smiod .#define H_GET_S16 bfd_h_get_signed_16
387c074d1c9Sdrahn .#define H_GET_S8  bfd_h_get_signed_8
388c074d1c9Sdrahn .
389c074d1c9Sdrahn .*/
3902159047fSniklas 
3912159047fSniklas /* Sign extension to bfd_signed_vma.  */
3922159047fSniklas #define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000)
393*007c2a45Smiod #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
394*007c2a45Smiod #define EIGHT_GAZILLION ((bfd_int64_t) 1 << 63)
3952159047fSniklas #define COERCE64(x) \
396*007c2a45Smiod   (((bfd_int64_t) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION)
3972159047fSniklas 
3982159047fSniklas bfd_vma
bfd_getb16(const void * p)399*007c2a45Smiod bfd_getb16 (const void *p)
4002159047fSniklas {
401*007c2a45Smiod   const bfd_byte *addr = p;
4022159047fSniklas   return (addr[0] << 8) | addr[1];
4032159047fSniklas }
4042159047fSniklas 
4052159047fSniklas bfd_vma
bfd_getl16(const void * p)406*007c2a45Smiod bfd_getl16 (const void *p)
4072159047fSniklas {
408*007c2a45Smiod   const bfd_byte *addr = p;
4092159047fSniklas   return (addr[1] << 8) | addr[0];
4102159047fSniklas }
4112159047fSniklas 
4122159047fSniklas bfd_signed_vma
bfd_getb_signed_16(const void * p)413*007c2a45Smiod bfd_getb_signed_16 (const void *p)
4142159047fSniklas {
415*007c2a45Smiod   const bfd_byte *addr = p;
4162159047fSniklas   return COERCE16 ((addr[0] << 8) | addr[1]);
4172159047fSniklas }
4182159047fSniklas 
4192159047fSniklas bfd_signed_vma
bfd_getl_signed_16(const void * p)420*007c2a45Smiod bfd_getl_signed_16 (const void *p)
4212159047fSniklas {
422*007c2a45Smiod   const bfd_byte *addr = p;
4232159047fSniklas   return COERCE16 ((addr[1] << 8) | addr[0]);
4242159047fSniklas }
4252159047fSniklas 
4262159047fSniklas void
bfd_putb16(bfd_vma data,void * p)427*007c2a45Smiod bfd_putb16 (bfd_vma data, void *p)
4282159047fSniklas {
429*007c2a45Smiod   bfd_byte *addr = p;
430*007c2a45Smiod   addr[0] = (data >> 8) & 0xff;
431*007c2a45Smiod   addr[1] = data & 0xff;
4322159047fSniklas }
4332159047fSniklas 
4342159047fSniklas void
bfd_putl16(bfd_vma data,void * p)435*007c2a45Smiod bfd_putl16 (bfd_vma data, void *p)
4362159047fSniklas {
437*007c2a45Smiod   bfd_byte *addr = p;
438*007c2a45Smiod   addr[0] = data & 0xff;
439*007c2a45Smiod   addr[1] = (data >> 8) & 0xff;
4402159047fSniklas }
4412159047fSniklas 
4422159047fSniklas bfd_vma
bfd_getb32(const void * p)443*007c2a45Smiod bfd_getb32 (const void *p)
4442159047fSniklas {
445*007c2a45Smiod   const bfd_byte *addr = p;
446b305b0f1Sespie   unsigned long v;
447b305b0f1Sespie 
448b305b0f1Sespie   v = (unsigned long) addr[0] << 24;
449b305b0f1Sespie   v |= (unsigned long) addr[1] << 16;
450b305b0f1Sespie   v |= (unsigned long) addr[2] << 8;
451b305b0f1Sespie   v |= (unsigned long) addr[3];
452*007c2a45Smiod   return v;
4532159047fSniklas }
4542159047fSniklas 
4552159047fSniklas bfd_vma
bfd_getl32(const void * p)456*007c2a45Smiod bfd_getl32 (const void *p)
4572159047fSniklas {
458*007c2a45Smiod   const bfd_byte *addr = p;
459b305b0f1Sespie   unsigned long v;
460b305b0f1Sespie 
461b305b0f1Sespie   v = (unsigned long) addr[0];
462b305b0f1Sespie   v |= (unsigned long) addr[1] << 8;
463b305b0f1Sespie   v |= (unsigned long) addr[2] << 16;
464b305b0f1Sespie   v |= (unsigned long) addr[3] << 24;
465*007c2a45Smiod   return v;
4662159047fSniklas }
4672159047fSniklas 
4682159047fSniklas bfd_signed_vma
bfd_getb_signed_32(const void * p)469*007c2a45Smiod bfd_getb_signed_32 (const void *p)
4702159047fSniklas {
471*007c2a45Smiod   const bfd_byte *addr = p;
472b305b0f1Sespie   unsigned long v;
473b305b0f1Sespie 
474b305b0f1Sespie   v = (unsigned long) addr[0] << 24;
475b305b0f1Sespie   v |= (unsigned long) addr[1] << 16;
476b305b0f1Sespie   v |= (unsigned long) addr[2] << 8;
477b305b0f1Sespie   v |= (unsigned long) addr[3];
478b305b0f1Sespie   return COERCE32 (v);
4792159047fSniklas }
4802159047fSniklas 
4812159047fSniklas bfd_signed_vma
bfd_getl_signed_32(const void * p)482*007c2a45Smiod bfd_getl_signed_32 (const void *p)
4832159047fSniklas {
484*007c2a45Smiod   const bfd_byte *addr = p;
485b305b0f1Sespie   unsigned long v;
486b305b0f1Sespie 
487b305b0f1Sespie   v = (unsigned long) addr[0];
488b305b0f1Sespie   v |= (unsigned long) addr[1] << 8;
489b305b0f1Sespie   v |= (unsigned long) addr[2] << 16;
490b305b0f1Sespie   v |= (unsigned long) addr[3] << 24;
491b305b0f1Sespie   return COERCE32 (v);
4922159047fSniklas }
4932159047fSniklas 
494*007c2a45Smiod bfd_uint64_t
bfd_getb64(const void * p ATTRIBUTE_UNUSED)495*007c2a45Smiod bfd_getb64 (const void *p ATTRIBUTE_UNUSED)
4962159047fSniklas {
497*007c2a45Smiod #ifdef BFD_HOST_64_BIT
498*007c2a45Smiod   const bfd_byte *addr = p;
499*007c2a45Smiod   bfd_uint64_t v;
5002159047fSniklas 
501*007c2a45Smiod   v  = addr[0]; v <<= 8;
502*007c2a45Smiod   v |= addr[1]; v <<= 8;
503*007c2a45Smiod   v |= addr[2]; v <<= 8;
504*007c2a45Smiod   v |= addr[3]; v <<= 8;
505*007c2a45Smiod   v |= addr[4]; v <<= 8;
506*007c2a45Smiod   v |= addr[5]; v <<= 8;
507*007c2a45Smiod   v |= addr[6]; v <<= 8;
508*007c2a45Smiod   v |= addr[7];
5092159047fSniklas 
510*007c2a45Smiod   return v;
5112159047fSniklas #else
5122159047fSniklas   BFD_FAIL();
5132159047fSniklas   return 0;
5142159047fSniklas #endif
5152159047fSniklas }
5162159047fSniklas 
517*007c2a45Smiod bfd_uint64_t
bfd_getl64(const void * p ATTRIBUTE_UNUSED)518*007c2a45Smiod bfd_getl64 (const void *p ATTRIBUTE_UNUSED)
5192159047fSniklas {
520*007c2a45Smiod #ifdef BFD_HOST_64_BIT
521*007c2a45Smiod   const bfd_byte *addr = p;
522*007c2a45Smiod   bfd_uint64_t v;
5232159047fSniklas 
524*007c2a45Smiod   v  = addr[7]; v <<= 8;
525*007c2a45Smiod   v |= addr[6]; v <<= 8;
526*007c2a45Smiod   v |= addr[5]; v <<= 8;
527*007c2a45Smiod   v |= addr[4]; v <<= 8;
528*007c2a45Smiod   v |= addr[3]; v <<= 8;
529*007c2a45Smiod   v |= addr[2]; v <<= 8;
530*007c2a45Smiod   v |= addr[1]; v <<= 8;
531*007c2a45Smiod   v |= addr[0];
5322159047fSniklas 
533*007c2a45Smiod   return v;
5342159047fSniklas #else
5352159047fSniklas   BFD_FAIL();
5362159047fSniklas   return 0;
5372159047fSniklas #endif
5382159047fSniklas 
5392159047fSniklas }
5402159047fSniklas 
541*007c2a45Smiod bfd_int64_t
bfd_getb_signed_64(const void * p ATTRIBUTE_UNUSED)542*007c2a45Smiod bfd_getb_signed_64 (const void *p ATTRIBUTE_UNUSED)
5432159047fSniklas {
544*007c2a45Smiod #ifdef BFD_HOST_64_BIT
545*007c2a45Smiod   const bfd_byte *addr = p;
546*007c2a45Smiod   bfd_uint64_t v;
5472159047fSniklas 
548*007c2a45Smiod   v  = addr[0]; v <<= 8;
549*007c2a45Smiod   v |= addr[1]; v <<= 8;
550*007c2a45Smiod   v |= addr[2]; v <<= 8;
551*007c2a45Smiod   v |= addr[3]; v <<= 8;
552*007c2a45Smiod   v |= addr[4]; v <<= 8;
553*007c2a45Smiod   v |= addr[5]; v <<= 8;
554*007c2a45Smiod   v |= addr[6]; v <<= 8;
555*007c2a45Smiod   v |= addr[7];
5562159047fSniklas 
557*007c2a45Smiod   return COERCE64 (v);
5582159047fSniklas #else
5592159047fSniklas   BFD_FAIL();
5602159047fSniklas   return 0;
5612159047fSniklas #endif
5622159047fSniklas }
5632159047fSniklas 
564*007c2a45Smiod bfd_int64_t
bfd_getl_signed_64(const void * p ATTRIBUTE_UNUSED)565*007c2a45Smiod bfd_getl_signed_64 (const void *p ATTRIBUTE_UNUSED)
5662159047fSniklas {
567*007c2a45Smiod #ifdef BFD_HOST_64_BIT
568*007c2a45Smiod   const bfd_byte *addr = p;
569*007c2a45Smiod   bfd_uint64_t v;
5702159047fSniklas 
571*007c2a45Smiod   v  = addr[7]; v <<= 8;
572*007c2a45Smiod   v |= addr[6]; v <<= 8;
573*007c2a45Smiod   v |= addr[5]; v <<= 8;
574*007c2a45Smiod   v |= addr[4]; v <<= 8;
575*007c2a45Smiod   v |= addr[3]; v <<= 8;
576*007c2a45Smiod   v |= addr[2]; v <<= 8;
577*007c2a45Smiod   v |= addr[1]; v <<= 8;
578*007c2a45Smiod   v |= addr[0];
5792159047fSniklas 
580*007c2a45Smiod   return COERCE64 (v);
5812159047fSniklas #else
5822159047fSniklas   BFD_FAIL();
5832159047fSniklas   return 0;
5842159047fSniklas #endif
5852159047fSniklas }
5862159047fSniklas 
5872159047fSniklas void
bfd_putb32(bfd_vma data,void * p)588*007c2a45Smiod bfd_putb32 (bfd_vma data, void *p)
5892159047fSniklas {
590*007c2a45Smiod   bfd_byte *addr = p;
591*007c2a45Smiod   addr[0] = (data >> 24) & 0xff;
592*007c2a45Smiod   addr[1] = (data >> 16) & 0xff;
593*007c2a45Smiod   addr[2] = (data >>  8) & 0xff;
594*007c2a45Smiod   addr[3] = data & 0xff;
5952159047fSniklas }
5962159047fSniklas 
5972159047fSniklas void
bfd_putl32(bfd_vma data,void * p)598*007c2a45Smiod bfd_putl32 (bfd_vma data, void *p)
5992159047fSniklas {
600*007c2a45Smiod   bfd_byte *addr = p;
601*007c2a45Smiod   addr[0] = data & 0xff;
602*007c2a45Smiod   addr[1] = (data >>  8) & 0xff;
603*007c2a45Smiod   addr[2] = (data >> 16) & 0xff;
604*007c2a45Smiod   addr[3] = (data >> 24) & 0xff;
6052159047fSniklas }
6062159047fSniklas 
6072159047fSniklas void
bfd_putb64(bfd_uint64_t data ATTRIBUTE_UNUSED,void * p ATTRIBUTE_UNUSED)608*007c2a45Smiod bfd_putb64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
6092159047fSniklas {
610*007c2a45Smiod #ifdef BFD_HOST_64_BIT
611*007c2a45Smiod   bfd_byte *addr = p;
612*007c2a45Smiod   addr[0] = (data >> (7*8)) & 0xff;
613*007c2a45Smiod   addr[1] = (data >> (6*8)) & 0xff;
614*007c2a45Smiod   addr[2] = (data >> (5*8)) & 0xff;
615*007c2a45Smiod   addr[3] = (data >> (4*8)) & 0xff;
616*007c2a45Smiod   addr[4] = (data >> (3*8)) & 0xff;
617*007c2a45Smiod   addr[5] = (data >> (2*8)) & 0xff;
618*007c2a45Smiod   addr[6] = (data >> (1*8)) & 0xff;
619*007c2a45Smiod   addr[7] = (data >> (0*8)) & 0xff;
6202159047fSniklas #else
6212159047fSniklas   BFD_FAIL();
6222159047fSniklas #endif
6232159047fSniklas }
6242159047fSniklas 
6252159047fSniklas void
bfd_putl64(bfd_uint64_t data ATTRIBUTE_UNUSED,void * p ATTRIBUTE_UNUSED)626*007c2a45Smiod bfd_putl64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
6272159047fSniklas {
628*007c2a45Smiod #ifdef BFD_HOST_64_BIT
629*007c2a45Smiod   bfd_byte *addr = p;
630*007c2a45Smiod   addr[7] = (data >> (7*8)) & 0xff;
631*007c2a45Smiod   addr[6] = (data >> (6*8)) & 0xff;
632*007c2a45Smiod   addr[5] = (data >> (5*8)) & 0xff;
633*007c2a45Smiod   addr[4] = (data >> (4*8)) & 0xff;
634*007c2a45Smiod   addr[3] = (data >> (3*8)) & 0xff;
635*007c2a45Smiod   addr[2] = (data >> (2*8)) & 0xff;
636*007c2a45Smiod   addr[1] = (data >> (1*8)) & 0xff;
637*007c2a45Smiod   addr[0] = (data >> (0*8)) & 0xff;
6382159047fSniklas #else
6392159047fSniklas   BFD_FAIL();
6402159047fSniklas #endif
6412159047fSniklas }
642b55d4692Sfgsch 
643b55d4692Sfgsch void
bfd_put_bits(bfd_uint64_t data,void * p,int bits,bfd_boolean big_p)644*007c2a45Smiod bfd_put_bits (bfd_uint64_t data, void *p, int bits, bfd_boolean big_p)
645b55d4692Sfgsch {
646*007c2a45Smiod   bfd_byte *addr = p;
647b55d4692Sfgsch   int i;
648b55d4692Sfgsch   int bytes;
649b55d4692Sfgsch 
650b55d4692Sfgsch   if (bits % 8 != 0)
651b55d4692Sfgsch     abort ();
652b55d4692Sfgsch 
653b55d4692Sfgsch   bytes = bits / 8;
654b55d4692Sfgsch   for (i = 0; i < bytes; i++)
655b55d4692Sfgsch     {
656b55d4692Sfgsch       int index = big_p ? bytes - i - 1 : i;
657b55d4692Sfgsch 
658*007c2a45Smiod       addr[index] = data & 0xff;
659b55d4692Sfgsch       data >>= 8;
660b55d4692Sfgsch     }
661b55d4692Sfgsch }
662b55d4692Sfgsch 
663*007c2a45Smiod bfd_uint64_t
bfd_get_bits(const void * p,int bits,bfd_boolean big_p)664*007c2a45Smiod bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
665b55d4692Sfgsch {
666*007c2a45Smiod   const bfd_byte *addr = p;
667*007c2a45Smiod   bfd_uint64_t data;
668b55d4692Sfgsch   int i;
669b55d4692Sfgsch   int bytes;
670b55d4692Sfgsch 
671b55d4692Sfgsch   if (bits % 8 != 0)
672b55d4692Sfgsch     abort ();
673b55d4692Sfgsch 
674b55d4692Sfgsch   data = 0;
675b55d4692Sfgsch   bytes = bits / 8;
676b55d4692Sfgsch   for (i = 0; i < bytes; i++)
677b55d4692Sfgsch     {
678b55d4692Sfgsch       int index = big_p ? i : bytes - i - 1;
679b55d4692Sfgsch 
680b55d4692Sfgsch       data = (data << 8) | addr[index];
681b55d4692Sfgsch     }
682b55d4692Sfgsch 
683b55d4692Sfgsch   return data;
684b55d4692Sfgsch }
6852159047fSniklas 
6862159047fSniklas /* Default implementation */
6872159047fSniklas 
688c074d1c9Sdrahn bfd_boolean
_bfd_generic_get_section_contents(bfd * abfd,sec_ptr section,void * location,file_ptr offset,bfd_size_type count)689*007c2a45Smiod _bfd_generic_get_section_contents (bfd *abfd,
690*007c2a45Smiod 				   sec_ptr section,
691*007c2a45Smiod 				   void *location,
692*007c2a45Smiod 				   file_ptr offset,
693*007c2a45Smiod 				   bfd_size_type count)
6942159047fSniklas {
6952159047fSniklas   if (count == 0)
696c074d1c9Sdrahn     return TRUE;
697b305b0f1Sespie 
698c074d1c9Sdrahn   if (offset + count > section->_raw_size)
699b305b0f1Sespie     {
700b305b0f1Sespie       bfd_set_error (bfd_error_invalid_operation);
701c074d1c9Sdrahn       return FALSE;
702b305b0f1Sespie     }
703b305b0f1Sespie 
704b305b0f1Sespie   if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
705c074d1c9Sdrahn       || bfd_bread (location, count, abfd) != count)
706c074d1c9Sdrahn     return FALSE;
707b305b0f1Sespie 
708c074d1c9Sdrahn   return TRUE;
7092159047fSniklas }
7102159047fSniklas 
711c074d1c9Sdrahn bfd_boolean
_bfd_generic_get_section_contents_in_window(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)712*007c2a45Smiod _bfd_generic_get_section_contents_in_window
713*007c2a45Smiod   (bfd *abfd ATTRIBUTE_UNUSED,
714*007c2a45Smiod    sec_ptr section ATTRIBUTE_UNUSED,
715*007c2a45Smiod    bfd_window *w ATTRIBUTE_UNUSED,
716*007c2a45Smiod    file_ptr offset ATTRIBUTE_UNUSED,
717*007c2a45Smiod    bfd_size_type count ATTRIBUTE_UNUSED)
7182159047fSniklas {
7192159047fSniklas #ifdef USE_MMAP
7202159047fSniklas   if (count == 0)
721c074d1c9Sdrahn     return TRUE;
722*007c2a45Smiod   if (abfd->xvec->_bfd_get_section_contents
723*007c2a45Smiod       != _bfd_generic_get_section_contents)
7242159047fSniklas     {
7252159047fSniklas       /* We don't know what changes the bfd's get_section_contents
7262159047fSniklas 	 method may have to make.  So punt trying to map the file
7272159047fSniklas 	 window, and let get_section_contents do its thing.  */
7282159047fSniklas       /* @@ FIXME : If the internal window has a refcount of 1 and was
7292159047fSniklas 	 allocated with malloc instead of mmap, just reuse it.  */
7302159047fSniklas       bfd_free_window (w);
731*007c2a45Smiod       w->i = bfd_zmalloc (sizeof (bfd_window_internal));
7322159047fSniklas       if (w->i == NULL)
733c074d1c9Sdrahn 	return FALSE;
734*007c2a45Smiod       w->i->data = bfd_malloc (count);
7352159047fSniklas       if (w->i->data == NULL)
7362159047fSniklas 	{
7372159047fSniklas 	  free (w->i);
7382159047fSniklas 	  w->i = NULL;
739c074d1c9Sdrahn 	  return FALSE;
7402159047fSniklas 	}
7412159047fSniklas       w->i->mapped = 0;
7422159047fSniklas       w->i->refcount = 1;
7432159047fSniklas       w->size = w->i->size = count;
7442159047fSniklas       w->data = w->i->data;
7452159047fSniklas       return bfd_get_section_contents (abfd, section, w->data, offset, count);
7462159047fSniklas     }
747c074d1c9Sdrahn   if (offset + count > section->_raw_size
748c074d1c9Sdrahn       || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
749c074d1c9Sdrahn 				TRUE))
750c074d1c9Sdrahn     return FALSE;
751c074d1c9Sdrahn   return TRUE;
7522159047fSniklas #else
7532159047fSniklas   abort ();
7542159047fSniklas #endif
7552159047fSniklas }
7562159047fSniklas 
7572159047fSniklas /* This generic function can only be used in implementations where creating
7582159047fSniklas    NEW sections is disallowed.  It is useful in patching existing sections
7592159047fSniklas    in read-write files, though.  See other set_section_contents functions
7602159047fSniklas    to see why it doesn't work for new sections.  */
761c074d1c9Sdrahn bfd_boolean
_bfd_generic_set_section_contents(bfd * abfd,sec_ptr section,const void * location,file_ptr offset,bfd_size_type count)762*007c2a45Smiod _bfd_generic_set_section_contents (bfd *abfd,
763*007c2a45Smiod 				   sec_ptr section,
764*007c2a45Smiod 				   const void *location,
765*007c2a45Smiod 				   file_ptr offset,
766*007c2a45Smiod 				   bfd_size_type count)
7672159047fSniklas {
7682159047fSniklas   if (count == 0)
769c074d1c9Sdrahn     return TRUE;
7702159047fSniklas 
771c074d1c9Sdrahn   if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
772c074d1c9Sdrahn       || bfd_bwrite (location, count, abfd) != count)
773c074d1c9Sdrahn     return FALSE;
7742159047fSniklas 
775c074d1c9Sdrahn   return TRUE;
7762159047fSniklas }
7772159047fSniklas 
7782159047fSniklas /*
7792159047fSniklas INTERNAL_FUNCTION
7802159047fSniklas 	bfd_log2
7812159047fSniklas 
7822159047fSniklas SYNOPSIS
7832159047fSniklas 	unsigned int bfd_log2 (bfd_vma x);
7842159047fSniklas 
7852159047fSniklas DESCRIPTION
7862159047fSniklas 	Return the log base 2 of the value supplied, rounded up.  E.g., an
787c074d1c9Sdrahn 	@var{x} of 1025 returns 11.  A @var{x} of 0 returns 0.
7882159047fSniklas */
7892159047fSniklas 
790b305b0f1Sespie unsigned int
bfd_log2(bfd_vma x)791*007c2a45Smiod bfd_log2 (bfd_vma x)
7922159047fSniklas {
793b305b0f1Sespie   unsigned int result = 0;
794b305b0f1Sespie 
795b305b0f1Sespie   while ((x = (x >> 1)) != 0)
796b305b0f1Sespie     ++result;
7972159047fSniklas   return result;
7982159047fSniklas }
7992159047fSniklas 
800c074d1c9Sdrahn bfd_boolean
bfd_generic_is_local_label_name(bfd * abfd,const char * name)801*007c2a45Smiod bfd_generic_is_local_label_name (bfd *abfd, const char *name)
8022159047fSniklas {
8032159047fSniklas   char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
8042159047fSniklas 
805c074d1c9Sdrahn   return name[0] == locals_prefix;
8062159047fSniklas }
8072159047fSniklas 
808b305b0f1Sespie /*  Can be used from / for bfd_merge_private_bfd_data to check that
809b305b0f1Sespie     endianness matches between input and output file.  Returns
810c074d1c9Sdrahn     TRUE for a match, otherwise returns FALSE and emits an error.  */
811c074d1c9Sdrahn bfd_boolean
_bfd_generic_verify_endian_match(bfd * ibfd,bfd * obfd)812*007c2a45Smiod _bfd_generic_verify_endian_match (bfd *ibfd, bfd *obfd)
813b305b0f1Sespie {
814b305b0f1Sespie   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
815b55d4692Sfgsch       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
816b305b0f1Sespie       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
817b305b0f1Sespie     {
818b55d4692Sfgsch       const char *msg;
819b55d4692Sfgsch 
820b55d4692Sfgsch       if (bfd_big_endian (ibfd))
821b55d4692Sfgsch 	msg = _("%s: compiled for a big endian system and target is little endian");
822b55d4692Sfgsch       else
823b55d4692Sfgsch 	msg = _("%s: compiled for a little endian system and target is big endian");
824b55d4692Sfgsch 
825c074d1c9Sdrahn       (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd));
826b305b0f1Sespie 
827b305b0f1Sespie       bfd_set_error (bfd_error_wrong_format);
828c074d1c9Sdrahn       return FALSE;
829b305b0f1Sespie     }
830b305b0f1Sespie 
831c074d1c9Sdrahn   return TRUE;
832c074d1c9Sdrahn }
833c074d1c9Sdrahn 
834c074d1c9Sdrahn /* Give a warning at runtime if someone compiles code which calls
835c074d1c9Sdrahn    old routines.  */
836c074d1c9Sdrahn 
837c074d1c9Sdrahn void
warn_deprecated(const char * what,const char * file,int line,const char * func)838*007c2a45Smiod warn_deprecated (const char *what,
839*007c2a45Smiod 		 const char *file,
840*007c2a45Smiod 		 int line,
841*007c2a45Smiod 		 const char *func)
842c074d1c9Sdrahn {
843c074d1c9Sdrahn   /* Poor man's tracking of functions we've already warned about.  */
844c074d1c9Sdrahn   static size_t mask = 0;
845c074d1c9Sdrahn 
846c074d1c9Sdrahn   if (~(size_t) func & ~mask)
847c074d1c9Sdrahn     {
848c074d1c9Sdrahn       /* Note: separate sentences in order to allow
849c074d1c9Sdrahn 	 for translation into other languages.  */
850c074d1c9Sdrahn       if (func)
851c074d1c9Sdrahn 	fprintf (stderr, _("Deprecated %s called at %s line %d in %s\n"),
852c074d1c9Sdrahn 		 what, file, line, func);
853c074d1c9Sdrahn       else
854c074d1c9Sdrahn 	fprintf (stderr, _("Deprecated %s called\n"), what);
855c074d1c9Sdrahn       mask |= ~(size_t) func;
856c074d1c9Sdrahn     }
857b305b0f1Sespie }
858