From fa289a5fde8cdc60336d6c53e75b1969f8a82f20 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 19 Oct 2011 23:02:50 +0000 Subject: [PATCH] * elf32-i386.c (i386_opcode16): Delete. (elf_i386_check_tls_transition): Use memcmp to compare contents. * elf64-x86-64.c (x86_64_opcode16, x86_64_opcode32): Delete. (elf_x86_64_check_tls_transition): Use memcmp to compare contents. --- bfd/ChangeLog | 7 +++++++ bfd/elf32-i386.c | 11 ++--------- bfd/elf64-x86-64.c | 39 +++++++++++---------------------------- 3 files changed, 20 insertions(+), 37 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 38ddcab6bc..b3e979bc75 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2011-10-20 Alan Modra + + * elf32-i386.c (i386_opcode16): Delete. + (elf_i386_check_tls_transition): Use memcmp to compare contents. + * elf64-x86-64.c (x86_64_opcode16, x86_64_opcode32): Delete. + (elf_x86_64_check_tls_transition): Use memcmp to compare contents. + 2011-10-19 Alan Modra PR ld/13177 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 74343560fd..7ef1fc1ec5 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1094,13 +1094,6 @@ elf_i386_copy_indirect_symbol (struct bfd_link_info *info, _bfd_elf_link_hash_copy_indirect (info, dir, ind); } -typedef union - { - unsigned char c[2]; - uint16_t i; - } -i386_opcode16; - /* Return TRUE if the TLS access code sequence support transition from R_TYPE. */ @@ -1271,8 +1264,8 @@ elf_i386_check_tls_transition (bfd *abfd, asection *sec, if (offset + 2 <= sec->size) { /* Make sure that it's a call *x@tlsdesc(%rax). */ - static i386_opcode16 call = { { 0xff, 0x10 } }; - return bfd_get_16 (abfd, contents + offset) == call.i; + static const unsigned char call[] = { 0xff, 0x10 }; + return memcmp (contents + offset, call, 2) == 0; } return FALSE; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 092f447f49..e4c3946157 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1007,20 +1007,6 @@ elf64_x86_64_elf_object_p (bfd *abfd) return TRUE; } -typedef union - { - unsigned char c[2]; - uint16_t i; - } -x86_64_opcode16; - -typedef union - { - unsigned char c[4]; - uint32_t i; - } -x86_64_opcode32; - /* Return TRUE if the TLS access code sequence support transition from R_TYPE. */ @@ -1076,24 +1062,23 @@ elf_x86_64_check_tls_transition (bfd *abfd, .word 0x6666; rex64; call __tls_get_addr can transit to different access model. */ - static x86_64_opcode32 call = { { 0x66, 0x66, 0x48, 0xe8 } }; + static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 }; + static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d }; + if ((offset + 12) > sec->size - || bfd_get_32 (abfd, contents + offset + 4) != call.i) + || memcmp (contents + offset + 4, call, 4) != 0) return FALSE; if (ABI_64_P (abfd)) { - static x86_64_opcode32 leaq = { { 0x66, 0x48, 0x8d, 0x3d } }; if (offset < 4 - || bfd_get_32 (abfd, contents + offset - 4) != leaq.i) + || memcmp (contents + offset - 4, leaq, 4) != 0) return FALSE; } else { - static x86_64_opcode16 lea = { { 0x8d, 0x3d } }; if (offset < 3 - || bfd_get_8 (abfd, contents + offset - 3) != 0x48 - || bfd_get_16 (abfd, contents + offset - 2) != lea.i) + || memcmp (contents + offset - 3, leaq + 1, 3) != 0) return FALSE; } } @@ -1104,15 +1089,13 @@ elf_x86_64_check_tls_transition (bfd *abfd, call __tls_get_addr can transit to different access model. */ - static x86_64_opcode32 ld = { { 0x48, 0x8d, 0x3d, 0xe8 } }; - x86_64_opcode32 op; + static const unsigned char lea[] = { 0x48, 0x8d, 0x3d }; if (offset < 3 || (offset + 9) > sec->size) return FALSE; - op.i = bfd_get_32 (abfd, contents + offset - 3); - op.c[3] = bfd_get_8 (abfd, contents + offset + 4); - if (op.i != ld.i) + if (memcmp (contents + offset - 3, lea, 3) != 0 + || 0xe8 != *(contents + offset + 4)) return FALSE; } @@ -1191,8 +1174,8 @@ elf_x86_64_check_tls_transition (bfd *abfd, if (offset + 2 <= sec->size) { /* Make sure that it's a call *x@tlsdesc(%rax). */ - static x86_64_opcode16 call = { { 0xff, 0x10 } }; - return bfd_get_16 (abfd, contents + offset) == call.i; + static const unsigned char call[] = { 0xff, 0x10 }; + return memcmp (contents + offset, call, 2) == 0; } return FALSE; -- 2.34.1