[PATCH v3 1/7] Adjust pdata function table entries sorting for AArch64

Evgeny Karpov evgeny@kmaps.co
Thu Aug 14 08:37:31 GMT 2025
The .pdata section contains an array of function table entries that
are used for exception handling. The entries should be sorted by
begin address, which is usually the first 4 bytes RVA in the entry.
Entry sizes are different for x64 and AArch64.
This difference is addressed in this patch.

This is the first patch in the patch series implementing
Structured Exception Handling (SEH) for aarch64-w64-mingw32.

Co-author:
Zac Walker <zacwalker@microsoft.com>

Contributor:
Ron Riddle <ron.riddle@microsoft.com>

Validated by
Martin Vejbora <martin.vejbora@microsoft.com>
Radek Barton <radek.barton@microsoft.com> and
Evgeny Karpov <evgeny@kmaps.co>

bfd/ChangeLog:

	* peXXigen.c (defined): New.
	(_bfd_XXi_final_link_postscript): Use
	FUNCTION_TABLE_ENTRY_SIZE.
---
 bfd/peXXigen.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index c337fc5b282..147b1cb0be2 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -4706,6 +4706,13 @@ _bfd_XXi_final_link_postscript (bfd * abfd,
struct coff_final_link_info *pfinfo)
 #if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) ||
defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) ||
defined (COFF_WITH_peRiscV64))
   {
     asection *sec = bfd_get_section_by_name (abfd, ".pdata");
+#if defined (COFF_WITH_peAArch64)
+/* https://learn.microsoft.com/en-us/cpp/build/arm64-exception-handling#pdata-records.
*/
+  #define FUNCTION_TABLE_ENTRY_SIZE 8
+#else
+/* https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#the-pdata-section.
*/
+  #define FUNCTION_TABLE_ENTRY_SIZE 12
+#endif

     if (sec)
       {
@@ -4715,8 +4722,8 @@ _bfd_XXi_final_link_postscript (bfd * abfd,
struct coff_final_link_info *pfinfo)
 	if (bfd_malloc_and_get_section (abfd, sec, &tmp_data))
 	  {
 	    qsort (tmp_data,
-		   (size_t) (x / 12),
-		   12, sort_x64_pdata);
+		   (size_t) (x / FUNCTION_TABLE_ENTRY_SIZE),
+		   FUNCTION_TABLE_ENTRY_SIZE, sort_x64_pdata);
 	    bfd_set_section_contents (pfinfo->output_bfd, sec,
 				      tmp_data, 0, x);
 	    free (tmp_data);
-- 
2.39.5


More information about the Binutils mailing list