summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2011-10-25 03:14:15 +0000
committerAlan Modra <amodra@bigpond.net.au>2011-10-25 03:14:15 +0000
commit1215c06dfd68c5ed7c3f0e6128c5cd95da1a95a9 (patch)
tree043fa7b6286ca13a82872e981c6a2599df558b30
parent5fff38bab243962b4617190929bf1e15c7c97c84 (diff)
downloadgdb-1215c06dfd68c5ed7c3f0e6128c5cd95da1a95a9.tar.gz
2011-10-20 Alan Modra <amodra@gmail.com>
* 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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-i386.c11
-rw-r--r--bfd/elf64-x86-64.c39
3 files changed, 19 insertions, 37 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a5227905bb9..1bd89b7ba42 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,12 @@
2011-10-25 Alan Modra <amodra@gmail.com>
Apply mainline patches
+ 2011-10-20 Alan Modra <amodra@gmail.com>
+ * 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 <amodra@gmail.com>
PR ld/13311
* elflink.c (elf_link_output_extsym): Correct test for warning when
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 38c7c5a6109..d518d014772 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 238c7bd29b6..3a2444b90c3 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;