From c1210543a60c2ba95f27ee94ae648f74e27b1ad7 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Wed, 1 Apr 2020 16:02:03 +0100 Subject: Rewrite abi-note.S in C. Using C code allows the compiler to add target specific object file markings based on CFLAGS. The arm specific abi-note.S is removed and similar object file fix up will be avoided on AArch64 with standard branch protection. --- csu/abi-note.S | 72 ---------------------------------------------- csu/abi-note.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ sysdeps/arm/abi-note.S | 8 ------ 3 files changed, 77 insertions(+), 80 deletions(-) delete mode 100644 csu/abi-note.S create mode 100644 csu/abi-note.c delete mode 100644 sysdeps/arm/abi-note.S diff --git a/csu/abi-note.S b/csu/abi-note.S deleted file mode 100644 index 2b4b5f8824..0000000000 --- a/csu/abi-note.S +++ /dev/null @@ -1,72 +0,0 @@ -/* Special .init and .fini section support. - Copyright (C) 1997-2020 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -/* Define an ELF note identifying the operating-system ABI that the - executable was created for. The ELF note information identifies a - particular OS or coordinated development effort within which the - ELF header's e_machine value plus (for dynamically linked programs) - the PT_INTERP dynamic linker name and DT_NEEDED shared library - names fully identify the runtime environment required by an - executable. - - The general format of ELF notes is as follows. - Offsets and lengths are bytes or (parenthetical references) to the - values in other fields. - -offset length contents -0 4 length of name -4 4 length of data -8 4 note type -12 (0) vendor name - - null-terminated ASCII string, padded to 4-byte alignment -12+(0) (4) note data, - - The GNU project and cooperating development efforts (including the - Linux community) use note type 1 and a vendor name string of "GNU" - for a note descriptor that indicates ABI requirements. The note data - is four 32-bit words. The first of these is an operating system - number (0=Linux, 1=Hurd, 2=Solaris, ...) and the remaining three - identify the earliest release of that OS that supports this ABI. - See abi-tags (top level) for details. */ - -#include -#include /* OS-specific ABI tag value */ - -/* The linker (GNU ld 2.8 and later) recognizes an allocated section whose - name begins with `.note' and creates a PT_NOTE program header entry - pointing at it. */ - - .section ".note.ABI-tag", "a" - .p2align 2 - .long 1f - 0f /* name length */ - .long 3f - 2f /* data length */ - .long 1 /* note type */ -0: .asciz "GNU" /* vendor name */ -1: .p2align 2 -2: .long __ABI_TAG_OS /* note data: the ABI tag */ - .long __ABI_TAG_VERSION -3: .p2align 2 /* pad out section */ diff --git a/csu/abi-note.c b/csu/abi-note.c new file mode 100644 index 0000000000..8febf4cac0 --- /dev/null +++ b/csu/abi-note.c @@ -0,0 +1,77 @@ +/* Special .init and .fini section support. + Copyright (C) 1997-2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Define an ELF note identifying the operating-system ABI that the + executable was created for. The ELF note information identifies a + particular OS or coordinated development effort within which the + ELF header's e_machine value plus (for dynamically linked programs) + the PT_INTERP dynamic linker name and DT_NEEDED shared library + names fully identify the runtime environment required by an + executable. + + The general format of ELF notes is as follows. + Offsets and lengths are bytes or (parenthetical references) to the + values in other fields. + +offset length contents +0 4 length of name +4 4 length of data +8 4 note type +12 (0) vendor name + - null-terminated ASCII string, padded to 4-byte alignment +12+(0) (4) note data, + + The GNU project and cooperating development efforts (including the + Linux community) use note type 1 and a vendor name string of "GNU" + for a note descriptor that indicates ABI requirements. The note data + is four 32-bit words. The first of these is an operating system + number (0=Linux, 1=Hurd, 2=Solaris, ...) and the remaining three + identify the earliest release of that OS that supports this ABI. + See abi-tags (top level) for details. */ + +#include +#include +#include +#include /* OS-specific ABI tag value */ + +/* The linker (GNU ld 2.8 and later) recognizes an allocated section whose + name begins with `.note' and creates a PT_NOTE program header entry + pointing at it. */ + +__attribute__ ((used, aligned (4), section (".note.ABI-tag"))) +static const struct +{ + ElfW(Nhdr) nhdr; + char name[4]; + int32_t desc[4]; +} __abi_tag = { + { .n_namesz = sizeof __abi_tag.name, + .n_descsz = sizeof __abi_tag.desc, + .n_type = 1 }, + "GNU", + { __ABI_TAG_OS, __ABI_TAG_VERSION } +}; diff --git a/sysdeps/arm/abi-note.S b/sysdeps/arm/abi-note.S deleted file mode 100644 index 07bd4c4619..0000000000 --- a/sysdeps/arm/abi-note.S +++ /dev/null @@ -1,8 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 - -#include -- cgit v1.2.3