(COERCE64): Avoid out-of-range numbers
This commit is contained in:
parent
ea753d03d6
commit
da3cd00a63
1 changed files with 41 additions and 19 deletions
60
bfd/libbfd.c
60
bfd/libbfd.c
|
@ -413,34 +413,45 @@ DESCRIPTION
|
||||||
To detect calling these with less than a bfd_vma, use gcc
|
To detect calling these with less than a bfd_vma, use gcc
|
||||||
-Wconversion on a host with 64 bit bfd_vma's.
|
-Wconversion on a host with 64 bit bfd_vma's.
|
||||||
|
|
||||||
|
.
|
||||||
|
.{* Byte swapping macros for user section data. *}
|
||||||
|
.
|
||||||
.#define bfd_put_8(abfd, val, ptr) \
|
.#define bfd_put_8(abfd, val, ptr) \
|
||||||
. (*((unsigned char *)ptr) = (unsigned char)val)
|
. (*((unsigned char *)(ptr)) = (unsigned char)val)
|
||||||
.#define bfd_put_signed_8(abfd, val, ptr) (*((char *)(ptr)) = (char)(val))
|
.#define bfd_put_signed_8 \
|
||||||
|
. bfd_put_8
|
||||||
.#define bfd_get_8(abfd, ptr) \
|
.#define bfd_get_8(abfd, ptr) \
|
||||||
. (*((unsigned char *)(ptr)))
|
. (*(unsigned char *)(ptr))
|
||||||
.#define bfd_get_signed_8(abfd, ptr) (((*(char *)(ptr) ^ 0x80) & 0xff) - 0x80)
|
.#define bfd_get_signed_8(abfd, ptr) \
|
||||||
|
. ((*(unsigned char *)(ptr) ^ 0x80) - 0x80)
|
||||||
|
.
|
||||||
.#define bfd_put_16(abfd, val, ptr) \
|
.#define bfd_put_16(abfd, val, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_putx16, ((val),(ptr)))
|
. BFD_SEND(abfd, bfd_putx16, ((val),(ptr)))
|
||||||
.#define bfd_put_signed_16 bfd_put_16
|
.#define bfd_put_signed_16 \
|
||||||
|
. bfd_put_16
|
||||||
.#define bfd_get_16(abfd, ptr) \
|
.#define bfd_get_16(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_getx16, (ptr))
|
. BFD_SEND(abfd, bfd_getx16, (ptr))
|
||||||
.#define bfd_get_signed_16(abfd, ptr) \
|
.#define bfd_get_signed_16(abfd, ptr) \
|
||||||
. BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
|
. BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
|
||||||
|
.
|
||||||
.#define bfd_put_32(abfd, val, ptr) \
|
.#define bfd_put_32(abfd, val, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_putx32, ((val),(ptr)))
|
. BFD_SEND(abfd, bfd_putx32, ((val),(ptr)))
|
||||||
.#define bfd_put_signed_32 bfd_put_32
|
.#define bfd_put_signed_32 \
|
||||||
|
. bfd_put_32
|
||||||
.#define bfd_get_32(abfd, ptr) \
|
.#define bfd_get_32(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_getx32, (ptr))
|
. BFD_SEND(abfd, bfd_getx32, (ptr))
|
||||||
.#define bfd_get_signed_32(abfd, ptr) \
|
.#define bfd_get_signed_32(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_getx_signed_32, (ptr))
|
. BFD_SEND(abfd, bfd_getx_signed_32, (ptr))
|
||||||
|
.
|
||||||
.#define bfd_put_64(abfd, val, ptr) \
|
.#define bfd_put_64(abfd, val, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_putx64, ((val), (ptr)))
|
. BFD_SEND(abfd, bfd_putx64, ((val), (ptr)))
|
||||||
.#define bfd_put_signed_64 bfd_put_64
|
.#define bfd_put_signed_64 \
|
||||||
|
. bfd_put_64
|
||||||
.#define bfd_get_64(abfd, ptr) \
|
.#define bfd_get_64(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_getx64, (ptr))
|
. BFD_SEND(abfd, bfd_getx64, (ptr))
|
||||||
.#define bfd_get_signed_64(abfd, ptr) \
|
.#define bfd_get_signed_64(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_getx_signed_64, (ptr))
|
. BFD_SEND(abfd, bfd_getx_signed_64, (ptr))
|
||||||
|
.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -454,43 +465,54 @@ DESCRIPTION
|
||||||
bretherin, except that they are used for removing information
|
bretherin, except that they are used for removing information
|
||||||
for the header records of object files. Believe it or not,
|
for the header records of object files. Believe it or not,
|
||||||
some object files keep their header records in big endian
|
some object files keep their header records in big endian
|
||||||
order, and their data in little endan order.
|
order, and their data in little endian order.
|
||||||
|
.
|
||||||
|
.{* Byte swapping macros for file header data. *}
|
||||||
|
.
|
||||||
.#define bfd_h_put_8(abfd, val, ptr) \
|
.#define bfd_h_put_8(abfd, val, ptr) \
|
||||||
. (*((unsigned char *)ptr) = (unsigned char)val)
|
. bfd_put_8 (abfd, val, ptr)
|
||||||
.#define bfd_h_put_signed_8(abfd, val, ptr) (*((char *)(ptr)) = (char)(val))
|
.#define bfd_h_put_signed_8(abfd, val, ptr) \
|
||||||
|
. bfd_put_8 (abfd, val, ptr)
|
||||||
.#define bfd_h_get_8(abfd, ptr) \
|
.#define bfd_h_get_8(abfd, ptr) \
|
||||||
. (*((unsigned char *)(ptr)))
|
. bfd_get_8 (abfd, ptr)
|
||||||
.#define bfd_h_get_signed_8 bfd_get_signed_8
|
.#define bfd_h_get_signed_8(abfd, ptr) \
|
||||||
|
. bfd_get_signed_8 (abfd, ptr)
|
||||||
|
.
|
||||||
.#define bfd_h_put_16(abfd, val, ptr) \
|
.#define bfd_h_put_16(abfd, val, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_putx16,(val,ptr))
|
. BFD_SEND(abfd, bfd_h_putx16,(val,ptr))
|
||||||
.#define bfd_h_put_signed_16 bfd_h_put_16
|
.#define bfd_h_put_signed_16 \
|
||||||
|
. bfd_h_put_16
|
||||||
.#define bfd_h_get_16(abfd, ptr) \
|
.#define bfd_h_get_16(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_getx16,(ptr))
|
. BFD_SEND(abfd, bfd_h_getx16,(ptr))
|
||||||
.#define bfd_h_get_signed_16(abfd, ptr) \
|
.#define bfd_h_get_signed_16(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr))
|
. BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr))
|
||||||
|
.
|
||||||
.#define bfd_h_put_32(abfd, val, ptr) \
|
.#define bfd_h_put_32(abfd, val, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_putx32,(val,ptr))
|
. BFD_SEND(abfd, bfd_h_putx32,(val,ptr))
|
||||||
.#define bfd_h_put_signed_32 bfd_h_put_32
|
.#define bfd_h_put_signed_32 \
|
||||||
|
. bfd_h_put_32
|
||||||
.#define bfd_h_get_32(abfd, ptr) \
|
.#define bfd_h_get_32(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_getx32,(ptr))
|
. BFD_SEND(abfd, bfd_h_getx32,(ptr))
|
||||||
.#define bfd_h_get_signed_32(abfd, ptr) \
|
.#define bfd_h_get_signed_32(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr))
|
. BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr))
|
||||||
|
.
|
||||||
.#define bfd_h_put_64(abfd, val, ptr) \
|
.#define bfd_h_put_64(abfd, val, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_putx64,(val, ptr))
|
. BFD_SEND(abfd, bfd_h_putx64,(val, ptr))
|
||||||
.#define bfd_h_put_signed_64 bfd_h_put_64
|
.#define bfd_h_put_signed_64 \
|
||||||
|
. bfd_h_put_64
|
||||||
.#define bfd_h_get_64(abfd, ptr) \
|
.#define bfd_h_get_64(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_getx64,(ptr))
|
. BFD_SEND(abfd, bfd_h_getx64,(ptr))
|
||||||
.#define bfd_h_get_signed_64(abfd, ptr) \
|
.#define bfd_h_get_signed_64(abfd, ptr) \
|
||||||
. BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr))
|
. BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr))
|
||||||
|
.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Sign extension to bfd_signed_vma. */
|
/* Sign extension to bfd_signed_vma. */
|
||||||
#define COERCE16(x) ((bfd_signed_vma) (((x) ^ 0x8000) - 0x8000))
|
#define COERCE16(x) ((bfd_signed_vma) (((x) ^ 0x8000) - 0x8000))
|
||||||
#define COERCE32(x) ((bfd_signed_vma) (((x) ^ 0x80000000) - 0x80000000))
|
#define COERCE32(x) ((bfd_signed_vma) (((x) ^ 0x80000000) - 0x80000000))
|
||||||
|
#define EIGHT_GAZILLION (((HOST_64_BIT)0x80000000) << 32)
|
||||||
#define COERCE64(x) ((bfd_signed_vma)\
|
#define COERCE64(x) ((bfd_signed_vma)\
|
||||||
(((x) ^ 0x8000000000000000) - 0x8000000000000000))
|
(((x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION))
|
||||||
|
|
||||||
bfd_vma
|
bfd_vma
|
||||||
DEFUN(_do_getb16,(addr),
|
DEFUN(_do_getb16,(addr),
|
||||||
|
|
Loading…
Reference in a new issue