public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
From: Giuliano Procida <gprocida@google.com>
To: libabigail@sourceware.org
Cc: dodji@seketeli.org, kernel-team@android.com, gprocida@google.com,
	 maennich@google.com, willdeacon@google.com
Subject: [PATCH 2/2] symtab: fix up 64-bit ARM address which may contain tags
Date: Thu,  7 Apr 2022 17:29:26 +0100	[thread overview]
Message-ID: <20220407162926.2076100-2-gprocida@google.com> (raw)
In-Reply-To: <20220407162926.2076100-1-gprocida@google.com>

64-bit ARM addresses normally have bits 47 to 63 as either all 0 or
all 1.  If tagging is used, bits 56 to 63 can vary, but the
interpretation of such values is as if the bits were all the same as
bit 55.

Such tagging is used for HWASAN and this affects the ELF symbol values
seen in shared libraries.

This commit changes the interpretation of 64-bit ARM symbol values by
unconditionally extending bit 55 into bits 56 to 63.

This fixes missing types for symbols in HWASAN-compiled libraries.

	* src/abg-elf-helpers.cc: (architecture_is_arm64): Add helper.
	* src/abg-elf-helpers.h: Likewise.
	* src/abg-symtab-reader.cc: (get_symbol_value): Adjust 64-bit
	ARM symbol values by extending bit 55 into bits 56 to 63.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 src/abg-elf-helpers.cc   | 17 +++++++++++++++++
 src/abg-elf-helpers.h    |  3 +++
 src/abg-symtab-reader.cc |  6 ++++++
 3 files changed, 26 insertions(+)

diff --git a/src/abg-elf-helpers.cc b/src/abg-elf-helpers.cc
index ee631831..787a05ff 100644
--- a/src/abg-elf-helpers.cc
+++ b/src/abg-elf-helpers.cc
@@ -900,6 +900,23 @@ architecture_is_arm32(Elf* elf_handle)
   return (elf_header && elf_header->e_machine == EM_ARM);
 }
 
+/// Test if the architecture of the current binary is arm64.
+///
+/// @param elf_handle the ELF handle to consider.
+///
+/// @return true iff the architecture of the current binary is arm64.
+bool
+architecture_is_arm64(Elf* elf_handle)
+{
+#ifdef HAVE_EM_AARCH64_MACRO
+  GElf_Ehdr  eh_mem;
+  GElf_Ehdr* elf_header = gelf_getehdr(elf_handle, &eh_mem);
+  return (elf_header && elf_header->e_machine == EM_AARCH64);
+#else
+  return false;
+#endif
+}
+
 /// Test if the endianness of the current binary is Big Endian.
 ///
 /// https://en.wikipedia.org/wiki/Endianness.
diff --git a/src/abg-elf-helpers.h b/src/abg-elf-helpers.h
index 718ce9c1..afaff24a 100644
--- a/src/abg-elf-helpers.h
+++ b/src/abg-elf-helpers.h
@@ -147,6 +147,9 @@ architecture_is_ppc64(Elf* elf_handle);
 bool
 architecture_is_arm32(Elf* elf_handle);
 
+bool
+architecture_is_arm64(Elf* elf_handle);
+
 bool
 architecture_is_big_endian(Elf* elf_handle);
 
diff --git a/src/abg-symtab-reader.cc b/src/abg-symtab-reader.cc
index 026988ee..3740cb7a 100644
--- a/src/abg-symtab-reader.cc
+++ b/src/abg-symtab-reader.cc
@@ -481,6 +481,7 @@ symtab::get_symbol_value(Elf* elf_handle,
 			 const elf_symbol_sptr& symbol_sptr)
 {
   const bool is_arm32 = elf_helpers::architecture_is_arm32(elf_handle);
+  const bool is_arm64 = elf_helpers::architecture_is_arm64(elf_handle);
   const bool is_ppc64 = elf_helpers::architecture_is_ppc64(elf_handle);
 
   GElf_Addr symbol_value =
@@ -498,6 +499,11 @@ symtab::get_symbol_value(Elf* elf_handle,
 	update_function_entry_address_symbol_map(elf_handle, elf_symbol,
 						 symbol_sptr);
     }
+  if (is_arm64)
+    // Copy bit 55 over bits 56 to 63 which may be tag information.
+    symbol_value = symbol_value & (1ULL<<55)
+		   ? symbol_value | (0xffULL<<56)
+		   : symbol_value &~ (0xffULL<<56);
 
   return symbol_value;
 }
-- 
2.35.1.1094.g7c7d902a7c-goog


  reply	other threads:[~2022-04-07 16:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-07 16:29 [PATCH 1/2] symtab: refactor ELF symbol value tweaks Giuliano Procida
2022-04-07 16:29 ` Giuliano Procida [this message]
2022-05-04 10:05   ` [PATCH 2/2] symtab: fix up 64-bit ARM address which may contain tags Dodji Seketeli
2022-05-04 10:00 ` [PATCH 1/2] symtab: refactor ELF symbol value tweaks Dodji Seketeli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220407162926.2076100-2-gprocida@google.com \
    --to=gprocida@google.com \
    --cc=dodji@seketeli.org \
    --cc=kernel-team@android.com \
    --cc=libabigail@sourceware.org \
    --cc=maennich@google.com \
    --cc=willdeacon@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).