[PATCH 03/12] aarch64: Add BTI landing pads to assembly code

Adhemerval Zanella adhemerval.zanella@linaro.org
Thu May 7 16:55:19 GMT 2020


On 30/04/2020 14:39, Szabolcs Nagy wrote:
> From 550fe66ed93e13c0f063955e81bfcb8db386413c Mon Sep 17 00:00:00 2001
> From: Sudakshina Das <sudi.das@arm.com>
> Date: Tue, 17 Mar 2020 15:44:18 +0000
> Subject: [PATCH 03/12] aarch64: Add BTI landing pads to assembly code
> 
> Adding the landing pads and the ELF markings are required if
> glibc is built with branch protection. For the handful of asm
> files this is done unconditionally, this simplifies maintenance
> and avoids complications where code layout is carefully aligned
> such that conditionally turning BTI off may cause performance
> regression (e.g. string functions).

I am seeing the warning the cover letter warned on old binutils:

  unsupported GNU_PROPERTY_TYPE (5) type: 0xc0000000

In this case, how exactly binutils handles it? Does it still emit
the expected correct notes, and if so, is the expected layout?

In any case I think these warning might be misleading and I think
it would be better to conditionalize the ELF landing pad marks
with binutils version (HAVE_XXX plus a configure check).

> 
> Note: old binutils ld just merges notes of input objects into
> the output, so if any input has a note claiming BTI support,
> then the output will have such note too which is undesirable.
> So after this commit libc shared objects and binaries linked
> with libc crt code may contain incorrect notes. For this reason
> checking properties in PT_NOTE is not reliable, new linkers
> create PT_GNU_PROPERTY which is always reliable when present
> so on AArch64 only that should be checked for properties.

Also on cover letter it states that PT_NOTES handling changes
is not yet done. Would it trigger any possible runtime failure
in possible binutils / glibc version combination?

> 
> Note: functions using ENTRY or ENTRY_ALIGN now have an
> additional BTI c after the function label so alignment of
> the code changes, but ENTRY_ALIGN_AND_PAD was fixed so there
> is no change to the existing code layout.
> 
> Co-authored-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
> ---
>  sysdeps/aarch64/__longjmp.S                   |  1 +
>  sysdeps/aarch64/crti.S                        |  4 +++
>  sysdeps/aarch64/crtn.S                        |  4 +++
>  sysdeps/aarch64/dl-tlsdesc.S                  |  5 ++++
>  sysdeps/aarch64/dl-trampoline.S               |  4 +++
>  sysdeps/aarch64/memchr.S                      |  1 +
>  sysdeps/aarch64/memcmp.S                      |  1 +
>  sysdeps/aarch64/memcpy.S                      |  1 +
>  sysdeps/aarch64/memrchr.S                     |  1 +
>  sysdeps/aarch64/memset.S                      |  1 +
>  sysdeps/aarch64/multiarch/memchr_nosimd.S     |  1 +
>  sysdeps/aarch64/multiarch/memcpy_falkor.S     |  1 +
>  sysdeps/aarch64/multiarch/memcpy_thunderx.S   |  1 +
>  sysdeps/aarch64/multiarch/memcpy_thunderx2.S  |  1 +
>  sysdeps/aarch64/multiarch/memmove_falkor.S    |  1 +
>  sysdeps/aarch64/multiarch/memset_base64.S     |  1 +
>  sysdeps/aarch64/multiarch/memset_kunpeng.S    |  1 +
>  sysdeps/aarch64/multiarch/strlen_asimd.S      |  1 +
>  sysdeps/aarch64/rawmemchr.S                   |  1 +
>  sysdeps/aarch64/setjmp.S                      |  1 +
>  sysdeps/aarch64/start.S                       |  2 ++
>  sysdeps/aarch64/strchr.S                      |  1 +
>  sysdeps/aarch64/strchrnul.S                   |  1 +
>  sysdeps/aarch64/strcmp.S                      |  1 +
>  sysdeps/aarch64/strcpy.S                      |  1 +
>  sysdeps/aarch64/strlen.S                      |  1 +
>  sysdeps/aarch64/strncmp.S                     |  1 +
>  sysdeps/aarch64/strnlen.S                     |  1 +
>  sysdeps/aarch64/strrchr.S                     |  1 +
>  sysdeps/aarch64/sysdep.h                      | 27 ++++++++++++++++++-
>  sysdeps/unix/sysv/linux/aarch64/__read_tp.S   |  1 +
>  sysdeps/unix/sysv/linux/aarch64/clone.S       |  1 +
>  sysdeps/unix/sysv/linux/aarch64/getcontext.S  |  1 +
>  sysdeps/unix/sysv/linux/aarch64/ioctl.S       |  1 +
>  .../unix/sysv/linux/aarch64/libc-__read_tp.S  |  1 +
>  sysdeps/unix/sysv/linux/aarch64/setcontext.S  |  1 +
>  sysdeps/unix/sysv/linux/aarch64/syscall.S     |  1 +
>  sysdeps/unix/sysv/linux/aarch64/vfork.S       |  1 +
>  38 files changed, 77 insertions(+), 1 deletion(-)
> 
> diff --git a/sysdeps/aarch64/__longjmp.S b/sysdeps/aarch64/__longjmp.S
> index f9060776b4..362171cdb8 100644
> --- a/sysdeps/aarch64/__longjmp.S
> +++ b/sysdeps/aarch64/__longjmp.S
> @@ -116,3 +116,4 @@ ENTRY (__longjmp)
>  	/* Use br instead of ret because ret is guaranteed to mispredict */
>  	br	x30
>  END (__longjmp)
> +END_FILE
> diff --git a/sysdeps/aarch64/crti.S b/sysdeps/aarch64/crti.S
> index 1728eac37a..89a9e25f5b 100644
> --- a/sysdeps/aarch64/crti.S
> +++ b/sysdeps/aarch64/crti.S
> @@ -75,6 +75,7 @@ call_weak_fn:
>  	.hidden	_init
>  	.type	_init, %function
>  _init:
> +	BTI_C
>  	stp	x29, x30, [sp, -16]!
>  	mov	x29, sp
>  #if PREINIT_FUNCTION_WEAK
> @@ -89,5 +90,8 @@ _init:
>  	.hidden	_fini
>  	.type	_fini, %function
>  _fini:
> +	BTI_C
>  	stp	x29, x30, [sp, -16]!
>  	mov	x29, sp
> +
> +END_FILE
> diff --git a/sysdeps/aarch64/crtn.S b/sysdeps/aarch64/crtn.S
> index c3e97cc449..94a6f970ef 100644
> --- a/sysdeps/aarch64/crtn.S
> +++ b/sysdeps/aarch64/crtn.S
> @@ -37,6 +37,8 @@
>  /* crtn.S puts function epilogues in the .init and .fini sections
>     corresponding to the prologues in crti.S. */
>  
> +#include <sysdep.h>
> +
>  	.section .init,"ax",%progbits
>  	ldp	x29, x30, [sp], 16
>  	RET
> @@ -44,3 +46,5 @@
>  	.section .fini,"ax",%progbits
>  	ldp	x29, x30, [sp], 16
>  	RET
> +
> +END_FILE
> diff --git a/sysdeps/aarch64/dl-tlsdesc.S b/sysdeps/aarch64/dl-tlsdesc.S
> index 557ad1d505..d55e0443aa 100644
> --- a/sysdeps/aarch64/dl-tlsdesc.S
> +++ b/sysdeps/aarch64/dl-tlsdesc.S
> @@ -74,6 +74,7 @@
>  	cfi_startproc
>  	.align 2
>  _dl_tlsdesc_return:
> +	BTI_C
>  	DELOUSE (0)
>  	ldr	PTR_REG (0), [x0, #PTR_SIZE]
>  	RET
> @@ -95,6 +96,7 @@ _dl_tlsdesc_return:
>  	cfi_startproc
>  	.align  2
>  _dl_tlsdesc_undefweak:
> +	BTI_C
>  	str	x1, [sp, #-16]!
>  	cfi_adjust_cfa_offset (16)
>  	DELOUSE (0)
> @@ -142,6 +144,7 @@ _dl_tlsdesc_undefweak:
>  	cfi_startproc
>  	.align 2
>  _dl_tlsdesc_dynamic:
> +	BTI_C
>  	DELOUSE (0)
>  
>  	/* Save just enough registers to support fast path, if we fall
> @@ -235,3 +238,5 @@ _dl_tlsdesc_dynamic:
>  	.size	_dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
>  # undef NSAVEXREGPAIRS
>  #endif
> +
> +END_FILE
> diff --git a/sysdeps/aarch64/dl-trampoline.S b/sysdeps/aarch64/dl-trampoline.S
> index 94e965c096..fba5689d09 100644
> --- a/sysdeps/aarch64/dl-trampoline.S
> +++ b/sysdeps/aarch64/dl-trampoline.S
> @@ -35,6 +35,7 @@
>  	cfi_startproc
>  	.align 2
>  _dl_runtime_resolve:
> +	BTI_C
>  	/* AArch64 we get called with:
>  	   ip0		&PLTGOT[2]
>  	   ip1		temp(dl resolver entry point)
> @@ -126,6 +127,7 @@ _dl_runtime_resolve:
>  	cfi_startproc
>  	.align 2
>  _dl_runtime_profile:
> +	BTI_C
>  	/* AArch64 we get called with:
>  	   ip0		&PLTGOT[2]
>  	   ip1		temp(dl resolver entry point)
> @@ -298,3 +300,5 @@ _dl_runtime_profile:
>  	.size _dl_runtime_profile, .-_dl_runtime_profile
>  #endif
>  	.previous
> +
> +END_FILE
> diff --git a/sysdeps/aarch64/memchr.S b/sysdeps/aarch64/memchr.S
> index 85c65cbfca..c67a31223f 100644
> --- a/sysdeps/aarch64/memchr.S
> +++ b/sysdeps/aarch64/memchr.S
> @@ -159,3 +159,4 @@ L(zero_length):
>  END (MEMCHR)
>  weak_alias (MEMCHR, memchr)
>  libc_hidden_builtin_def (memchr)
> +END_FILE
> diff --git a/sysdeps/aarch64/memcmp.S b/sysdeps/aarch64/memcmp.S
> index 827f54f99e..c6e07f9287 100644
> --- a/sysdeps/aarch64/memcmp.S
> +++ b/sysdeps/aarch64/memcmp.S
> @@ -178,3 +178,4 @@ END (memcmp)
>  #undef bcmp
>  weak_alias (memcmp, bcmp)
>  libc_hidden_builtin_def (memcmp)
> +END_FILE
> diff --git a/sysdeps/aarch64/memcpy.S b/sysdeps/aarch64/memcpy.S
> index e0b4c4502f..543d9417f3 100644
> --- a/sysdeps/aarch64/memcpy.S
> +++ b/sysdeps/aarch64/memcpy.S
> @@ -282,3 +282,4 @@ L(copy64_from_start):
>  
>  END (MEMMOVE)
>  libc_hidden_builtin_def (MEMMOVE)
> +END_FILE
> diff --git a/sysdeps/aarch64/memrchr.S b/sysdeps/aarch64/memrchr.S
> index ace5a94e8f..f35a68d14d 100644
> --- a/sysdeps/aarch64/memrchr.S
> +++ b/sysdeps/aarch64/memrchr.S
> @@ -163,3 +163,4 @@ L(zero_length):
>  END (__memrchr)
>  weak_alias (__memrchr, memrchr)
>  libc_hidden_builtin_def (memrchr)
> +END_FILE
> diff --git a/sysdeps/aarch64/memset.S b/sysdeps/aarch64/memset.S
> index ac577f1660..7cdae20563 100644
> --- a/sysdeps/aarch64/memset.S
> +++ b/sysdeps/aarch64/memset.S
> @@ -189,3 +189,4 @@ L(zva_other):
>  
>  END (MEMSET)
>  libc_hidden_builtin_def (MEMSET)
> +END_FILE
> diff --git a/sysdeps/aarch64/multiarch/memchr_nosimd.S b/sysdeps/aarch64/multiarch/memchr_nosimd.S
> index 41ce10eb32..6d7d38d5bb 100644
> --- a/sysdeps/aarch64/multiarch/memchr_nosimd.S
> +++ b/sysdeps/aarch64/multiarch/memchr_nosimd.S
> @@ -221,3 +221,4 @@ L(none_chr):
>  
>  END (MEMCHR)
>  libc_hidden_builtin_def (MEMCHR)
> +END_FILE
> diff --git a/sysdeps/aarch64/multiarch/memcpy_falkor.S b/sysdeps/aarch64/multiarch/memcpy_falkor.S
> index 35a1fae1b9..999aa48b16 100644
> --- a/sysdeps/aarch64/multiarch/memcpy_falkor.S
> +++ b/sysdeps/aarch64/multiarch/memcpy_falkor.S
> @@ -188,4 +188,5 @@ L(last64):
>  
>  END (__memcpy_falkor)
>  libc_hidden_builtin_def (__memcpy_falkor)
> +END_FILE
>  #endif
> diff --git a/sysdeps/aarch64/multiarch/memcpy_thunderx.S b/sysdeps/aarch64/multiarch/memcpy_thunderx.S
> index e9407571b5..e6e36a6633 100644
> --- a/sysdeps/aarch64/multiarch/memcpy_thunderx.S
> +++ b/sysdeps/aarch64/multiarch/memcpy_thunderx.S
> @@ -318,5 +318,6 @@ L(move_long):
>  
>  END (MEMCPY)
>  libc_hidden_builtin_def (MEMCPY)
> +END_FILE
>  
>  #endif
> diff --git a/sysdeps/aarch64/multiarch/memcpy_thunderx2.S b/sysdeps/aarch64/multiarch/memcpy_thunderx2.S
> index 68e99455c8..fde4c7198c 100644
> --- a/sysdeps/aarch64/multiarch/memcpy_thunderx2.S
> +++ b/sysdeps/aarch64/multiarch/memcpy_thunderx2.S
> @@ -474,4 +474,5 @@ L(ext_table):
>  	.word	L(ext_size_15) -.
>  
>  libc_hidden_builtin_def (MEMCPY)
> +END_FILE
>  #endif
> diff --git a/sysdeps/aarch64/multiarch/memmove_falkor.S b/sysdeps/aarch64/multiarch/memmove_falkor.S
> index 35fc1fdd41..d8cc992d27 100644
> --- a/sysdeps/aarch64/multiarch/memmove_falkor.S
> +++ b/sysdeps/aarch64/multiarch/memmove_falkor.S
> @@ -223,3 +223,4 @@ L(move_long):
>  
>  END (__memmove_falkor)
>  libc_hidden_builtin_def (__memmove_falkor)
> +END_FILE
> diff --git a/sysdeps/aarch64/multiarch/memset_base64.S b/sysdeps/aarch64/multiarch/memset_base64.S
> index 8f85cd1caf..ee0b832ef9 100644
> --- a/sysdeps/aarch64/multiarch/memset_base64.S
> +++ b/sysdeps/aarch64/multiarch/memset_base64.S
> @@ -184,3 +184,4 @@ L(zva_64):
>  
>  END (MEMSET)
>  libc_hidden_builtin_def (MEMSET)
> +END_FILE
> diff --git a/sysdeps/aarch64/multiarch/memset_kunpeng.S b/sysdeps/aarch64/multiarch/memset_kunpeng.S
> index 8e051d4fd1..aa7ab62fdd 100644
> --- a/sysdeps/aarch64/multiarch/memset_kunpeng.S
> +++ b/sysdeps/aarch64/multiarch/memset_kunpeng.S
> @@ -111,3 +111,4 @@ L(set_long):
>  END (MEMSET)
>  libc_hidden_builtin_def (MEMSET)
>  #endif
> +END_FILE
> diff --git a/sysdeps/aarch64/multiarch/strlen_asimd.S b/sysdeps/aarch64/multiarch/strlen_asimd.S
> index 236a2c96a6..c28aa0ca8d 100644
> --- a/sysdeps/aarch64/multiarch/strlen_asimd.S
> +++ b/sysdeps/aarch64/multiarch/strlen_asimd.S
> @@ -176,3 +176,4 @@ L(page_cross):
>  END (__strlen_asimd)
>  weak_alias (__strlen_asimd, strlen_asimd)
>  libc_hidden_builtin_def (strlen_asimd)
> +END_FILE
> diff --git a/sysdeps/aarch64/rawmemchr.S b/sysdeps/aarch64/rawmemchr.S
> index 5c7a664fb4..4ad614a169 100644
> --- a/sysdeps/aarch64/rawmemchr.S
> +++ b/sysdeps/aarch64/rawmemchr.S
> @@ -40,3 +40,4 @@ L(do_strlen):
>  END (__rawmemchr)
>  weak_alias (__rawmemchr, rawmemchr)
>  libc_hidden_builtin_def (__rawmemchr)
> +END_FILE
> diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S
> index 28fdd3f46a..9a0201ef70 100644
> --- a/sysdeps/aarch64/setjmp.S
> +++ b/sysdeps/aarch64/setjmp.S
> @@ -73,3 +73,4 @@ ENTRY (__sigsetjmp)
>  #endif
>  END (__sigsetjmp)
>  hidden_def (__sigsetjmp)
> +END_FILE
> diff --git a/sysdeps/aarch64/start.S b/sysdeps/aarch64/start.S
> index d96cf57e2d..e6c0393c20 100644
> --- a/sysdeps/aarch64/start.S
> +++ b/sysdeps/aarch64/start.S
> @@ -46,6 +46,7 @@
>  	.globl _start
>  	.type _start,#function
>  _start:
> +	BTI_C
>  	/* Create an initial frame with 0 LR and FP */
>  	mov	x29, #0
>  	mov	x30, #0
> @@ -110,3 +111,4 @@ __data_start:
>  	.long 0
>  	.weak data_start
>  	data_start = __data_start
> +END_FILE
> diff --git a/sysdeps/aarch64/strchr.S b/sysdeps/aarch64/strchr.S
> index 4a75e73945..e1f98aa42c 100644
> --- a/sysdeps/aarch64/strchr.S
> +++ b/sysdeps/aarch64/strchr.S
> @@ -137,3 +137,4 @@ L(tail):
>  END (strchr)
>  libc_hidden_builtin_def (strchr)
>  weak_alias (strchr, index)
> +END_FILE
> diff --git a/sysdeps/aarch64/strchrnul.S b/sysdeps/aarch64/strchrnul.S
> index a65be6cba8..a9ccc54205 100644
> --- a/sysdeps/aarch64/strchrnul.S
> +++ b/sysdeps/aarch64/strchrnul.S
> @@ -129,3 +129,4 @@ L(tail):
>  
>  END(__strchrnul)
>  weak_alias (__strchrnul, strchrnul)
> +END_FILE
> diff --git a/sysdeps/aarch64/strcmp.S b/sysdeps/aarch64/strcmp.S
> index d044c29e9b..a7bee697c0 100644
> --- a/sysdeps/aarch64/strcmp.S
> +++ b/sysdeps/aarch64/strcmp.S
> @@ -182,3 +182,4 @@ L(done):
>  	RET
>  END(strcmp)
>  libc_hidden_builtin_def (strcmp)
> +END_FILE
> diff --git a/sysdeps/aarch64/strcpy.S b/sysdeps/aarch64/strcpy.S
> index 548130e413..631da4a358 100644
> --- a/sysdeps/aarch64/strcpy.S
> +++ b/sysdeps/aarch64/strcpy.S
> @@ -321,3 +321,4 @@ libc_hidden_builtin_def (stpcpy)
>  #else
>  libc_hidden_builtin_def (strcpy)
>  #endif
> +END_FILE
> diff --git a/sysdeps/aarch64/strlen.S b/sysdeps/aarch64/strlen.S
> index e01fab7c2a..3af25de4b8 100644
> --- a/sysdeps/aarch64/strlen.S
> +++ b/sysdeps/aarch64/strlen.S
> @@ -222,3 +222,4 @@ L(page_cross):
>  END (STRLEN)
>  weak_alias (STRLEN, strlen)
>  libc_hidden_builtin_def (strlen)
> +END_FILE
> diff --git a/sysdeps/aarch64/strncmp.S b/sysdeps/aarch64/strncmp.S
> index c5141fab8a..d289d4a3ba 100644
> --- a/sysdeps/aarch64/strncmp.S
> +++ b/sysdeps/aarch64/strncmp.S
> @@ -270,3 +270,4 @@ L(ret0):
>  
>  END (strncmp)
>  libc_hidden_builtin_def (strncmp)
> +END_FILE
> diff --git a/sysdeps/aarch64/strnlen.S b/sysdeps/aarch64/strnlen.S
> index 5981247dd9..964536dba9 100644
> --- a/sysdeps/aarch64/strnlen.S
> +++ b/sysdeps/aarch64/strnlen.S
> @@ -213,3 +213,4 @@ END (__strnlen)
>  libc_hidden_def (__strnlen)
>  weak_alias (__strnlen, strnlen)
>  libc_hidden_def (strnlen)
> +END_FILE
> diff --git a/sysdeps/aarch64/strrchr.S b/sysdeps/aarch64/strrchr.S
> index 94da08d351..9f6d956f21 100644
> --- a/sysdeps/aarch64/strrchr.S
> +++ b/sysdeps/aarch64/strrchr.S
> @@ -164,3 +164,4 @@ L(null_search):
>  END(strrchr)
>  weak_alias (strrchr, rindex)
>  libc_hidden_builtin_def (strrchr)
> +END_FILE
> diff --git a/sysdeps/aarch64/sysdep.h b/sysdeps/aarch64/sysdep.h
> index 604c489170..07dc7858a5 100644
> --- a/sysdeps/aarch64/sysdep.h
> +++ b/sysdeps/aarch64/sysdep.h
> @@ -41,12 +41,35 @@
>  
>  #define ASM_SIZE_DIRECTIVE(name) .size name,.-name
>  
> +/* Branch Target Identitication support.  */
> +#define BTI_C		hint	34
> +#define BTI_J		hint	36
> +
> +#define FEATURE_1_BTI 1
> +#define FEATURE_1_PAC 2

There are GNU_PROPERTY_AARCH64_FEATURE_1_BTI and GNU_PROPERTY_AARCH64_FEATURE_1_PAC,
why not use them?

> +
> +/* Add a GNU_PROPERTY_AARCH64_FEATURE_1_AND note.  */
> +#define GNU_PROPERTY(features)		\
> +  .section .note.gnu.property, "a";	\
> +  .p2align 3;				\
> +  .word 4;				\
> +  .word 16;				\
> +  .word 5;				\
> +  .asciz "GNU";				\
> +  .word 0xc0000000;			\
> +  .word 4;				\
> +  .word features;			\
> +  .word 0;
> +
> +#define END_FILE GNU_PROPERTY(FEATURE_1_BTI)

END_FILE name does not really give much information.  Would be better
to use ADD_GNU_PROPERTIES or something?

> +
>  /* Define an entry point visible from C.  */
>  #define ENTRY(name)						\
>    .globl C_SYMBOL_NAME(name);					\
>    .type C_SYMBOL_NAME(name),%function;				\
>    .align 4;							\
>    C_LABEL(name)							\
> +  BTI_C;							\
>    cfi_startproc;						\
>    CALL_MCOUNT
>  
> @@ -56,6 +79,7 @@
>    .type C_SYMBOL_NAME(name),%function;				\
>    .p2align align;						\
>    C_LABEL(name)							\
> +  BTI_C;							\
>    cfi_startproc;						\
>    CALL_MCOUNT
>  
> @@ -68,10 +92,11 @@
>    .globl C_SYMBOL_NAME(name);					\
>    .type C_SYMBOL_NAME(name),%function;				\
>    .p2align align;						\
> -  .rep padding;							\
> +  .rep padding - 1; /* -1 for bti c.  */			\
>    nop;								\
>    .endr;							\
>    C_LABEL(name)							\
> +  BTI_C;							\
>    cfi_startproc;						\
>    CALL_MCOUNT
>  
> diff --git a/sysdeps/unix/sysv/linux/aarch64/__read_tp.S b/sysdeps/unix/sysv/linux/aarch64/__read_tp.S
> index 12e1131fe7..7825aa5e1b 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/__read_tp.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/__read_tp.S
> @@ -23,3 +23,4 @@ ENTRY (__read_tp)
>  	mrs	x0, tpidr_el0
>  	RET
>  END   (__read_tp)
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/clone.S b/sysdeps/unix/sysv/linux/aarch64/clone.S
> index 2b14106fd1..15b5a7b217 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/clone.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/clone.S
> @@ -85,3 +85,4 @@ thread_start:
>  
>  libc_hidden_def (__clone)
>  weak_alias (__clone, clone)
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/getcontext.S b/sysdeps/unix/sysv/linux/aarch64/getcontext.S
> index 8571556189..95f61d5f28 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/getcontext.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/getcontext.S
> @@ -107,3 +107,4 @@ ENTRY(__getcontext)
>  
>  	PSEUDO_END (__getcontext)
>  weak_alias (__getcontext, getcontext)
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/ioctl.S b/sysdeps/unix/sysv/linux/aarch64/ioctl.S
> index ed36e309c4..19abf43726 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/ioctl.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/ioctl.S
> @@ -30,3 +30,4 @@ PSEUDO_END (__ioctl)
>  
>  libc_hidden_def (__ioctl)
>  weak_alias (__ioctl, ioctl)
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc-__read_tp.S b/sysdeps/unix/sysv/linux/aarch64/libc-__read_tp.S
> index 6de259ed83..df5eec8599 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc-__read_tp.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc-__read_tp.S
> @@ -17,3 +17,4 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <__read_tp.S>
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/setcontext.S b/sysdeps/unix/sysv/linux/aarch64/setcontext.S
> index 61fb813db3..d9d6c0f364 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/setcontext.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/setcontext.S
> @@ -128,3 +128,4 @@ ENTRY (__startcontext)
>  	cbnz	x0, __setcontext
>  1:	b       HIDDEN_JUMPTARGET (exit)
>  END (__startcontext)
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/syscall.S b/sysdeps/unix/sysv/linux/aarch64/syscall.S
> index 993e307fcf..10e59ece58 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/syscall.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/syscall.S
> @@ -42,3 +42,4 @@ ENTRY (syscall)
>  1:
>  	b	SYSCALL_ERROR
>  PSEUDO_END (syscall)
> +END_FILE
> diff --git a/sysdeps/unix/sysv/linux/aarch64/vfork.S b/sysdeps/unix/sysv/linux/aarch64/vfork.S
> index 9c8ea48c5a..0306003a22 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/vfork.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/vfork.S
> @@ -40,3 +40,4 @@ libc_hidden_def (__vfork)
>  
>  weak_alias (__vfork, vfork)
>  strong_alias (__vfork, __libc_vfork)
> +END_FILE
> -- 
> 2.17.1


More information about the Libc-alpha mailing list