diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f29dec5156..6810f6b99b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-03-05 Nick Clifton + + PR binutils/17765 + * elflink.c (put_value): Avoid using an undefined shift + operation. + 2015-03-05 H.J. Lu PR ld/pr15228 diff --git a/bfd/elflink.c b/bfd/elflink.c index 6ee649901d..b285e765de 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -7793,28 +7793,32 @@ put_value (bfd_vma size, { location += (size - chunksz); - for (; size; size -= chunksz, location -= chunksz, x >>= (chunksz * 8)) + for (; size; size -= chunksz, location -= chunksz) { switch (chunksz) { - default: - case 0: - abort (); case 1: bfd_put_8 (input_bfd, x, location); + x >>= 8; break; case 2: bfd_put_16 (input_bfd, x, location); + x >>= 16; break; case 4: bfd_put_32 (input_bfd, x, location); + x >>= 32; break; - case 8: #ifdef BFD64 + case 8: bfd_put_64 (input_bfd, x, location); -#else - abort (); + /* Computed this way because x >>= 64 is undefined if x is a 64-bit value. */ + x >>= 32; + x >>= 32; + break; #endif + default: + abort (); break; } }