[PATCH v3 1/1] Fix IAT (Import Address Table) alignment on AArch64

Jan Beulich jbeulich@suse.com
Fri May 8 08:28:36 GMT 2026


On 05.05.2026 10:34, Evgeny Karpov wrote:
> The IAT should be aligned to 8 bytes in aarch64-w64-mingw32, otherwise, it might
> result in relocation issues.
> 
> When a function is imported from DLL, it generates the following code:
> 
> adrp    x19, __imp_fn
> ldr     x19, [x19, #:lo12:__imp_fn]
> 
> 8 byte alignment is required for ldr relocation. Addresses are placed in IAT.
> The size of the chunk on AArch64 is 8 bytes.
> If IAT is not aligned to 8 bytes, the relocation issue appears.
> This patch fixes this issue by aligning IAT to 8 bytes for PE32+.
> 
> binutils/ChangeLog:
> 
> 	* dlltool.c (make_head): Apply alignment to IAT.
> 	(make_delay_head): Apply alignment to Delay IAT.
> 	(main): Adjust 8 byte alignment for PE32+.

Okay, with ...

> @@ -4013,6 +4017,14 @@ main (int ac, char **av)
>    /* Check if we generated PE+.  */
>    create_for_pep = (strcmp (mname, "i386:x86-64") == 0
>  		    || strcmp (mname, "arm64") == 0);
> +  if (create_for_pep)
> +    {
> +      /* Update default 4 byte IAT (Import Address Table) alignemnt to 8 bytes
> +	 for PE32+.

... the typo here (alignment) corrected. I'll do that while committing.

I guess I'll also replace AArch64 with PE32+ in the title.

Jan


More information about the Binutils mailing list