public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "Clément Chigot" <chigot@adacore.com>
To: binutils@sourceware.org
Cc: "Clément Chigot" <chigot@adacore.com>
Subject: [PATCH 3/5] ld: add support of QNX stack arguments for aarch64nto
Date: Thu, 16 Mar 2023 11:17:34 +0100	[thread overview]
Message-ID: <20230316101736.482737-4-chigot@adacore.com> (raw)
In-Reply-To: <20230316101736.482737-1-chigot@adacore.com>

QNX is handling the stack argument using a .note section. Generate it
according to ELF argument -zexecstack, -zstack-size and a new NTO
argument --lazy-stack. Another NTO argument --stack mimicking
-zstack-size is added in order to ensure compatibility with previously
made NTO linkers.
This requires a new emultempl nto.em which is applied above the default
${ARCH}elf.em.

ld/ChangeLog:

	* emulparams/aarch64nto.sh: Move to nto.em.
	* emultempl/nto.em: New file.
	* testsuite/ld-aarch64/aarch64-nto.exp: New test.
	* testsuite/ld-aarch64/nto-stack-note-1.d: New test.
	* testsuite/ld-aarch64/nto-stack-note-2.d: New test.
	* testsuite/ld-aarch64/start.s: New test.
---
 ld/emulparams/aarch64nto.sh                |   2 +-
 ld/emultempl/nto.em                        | 163 +++++++++++++++++++++
 ld/testsuite/ld-aarch64/aarch64-nto.exp    |  28 ++++
 ld/testsuite/ld-aarch64/nto-stack-note-1.d |  12 ++
 ld/testsuite/ld-aarch64/nto-stack-note-2.d |  12 ++
 ld/testsuite/ld-aarch64/start.s            |   4 +
 6 files changed, 220 insertions(+), 1 deletion(-)
 create mode 100644 ld/emultempl/nto.em
 create mode 100644 ld/testsuite/ld-aarch64/aarch64-nto.exp
 create mode 100644 ld/testsuite/ld-aarch64/nto-stack-note-1.d
 create mode 100644 ld/testsuite/ld-aarch64/nto-stack-note-2.d
 create mode 100644 ld/testsuite/ld-aarch64/start.s

diff --git a/ld/emulparams/aarch64nto.sh b/ld/emulparams/aarch64nto.sh
index 4f0657def55..5138e335ccc 100644
--- a/ld/emulparams/aarch64nto.sh
+++ b/ld/emulparams/aarch64nto.sh
@@ -10,7 +10,7 @@ LITTLE_OUTPUT_FORMAT="elf64-littleaarch64"
 NO_REL_RELOCS=yes
 
 TEMPLATE_NAME=elf
-EXTRA_EM_FILE=aarch64elf
+EXTRA_EM_FILE=nto
 
 GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
diff --git a/ld/emultempl/nto.em b/ld/emultempl/nto.em
new file mode 100644
index 00000000000..b38fddd251c
--- /dev/null
+++ b/ld/emultempl/nto.em
@@ -0,0 +1,163 @@
+# This shell script emits a C file. -*- C -*-
+#   Copyright 2023 Free Software Foundation, Inc.
+#
+# This file is part of GLD, the Gnu Linker.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+# This file is sourced from elf.em, and defines extra Neutrino
+# specific routines.
+
+# NTO templates aims to refine the default ${ARCH}elf.em template.
+. "${srcdir}/emultempl/${ARCH}elf.em"
+
+cat >>e${EMULATION_NAME}.c <<EOF
+
+#include "elf/internal.h"
+#include "elf/common.h"
+#include "elf-bfd.h"
+#include "../bfd/libbfd.h"
+
+bool nto_lazy_stack = false;
+struct nto_stack_note
+{
+  unsigned char stacksize[4];
+  unsigned char stackalloc[4];
+  unsigned char execstack[4];
+};
+
+/* Generate the QNT_STACK .note section.  */
+static void
+nto_add_note_section (void) {
+  asection *note_sec;
+  flagword flags;
+  Elf_External_Note *e_note;
+  bfd_size_type size, h_size;
+  struct nto_stack_note *n_note;
+
+  /* Don't create a note if the stack size isn't provided.  */
+  if (link_info.stacksize <= 0)
+    return;
+
+  /* As ${ARCH}elf.em is imported and ${ARCH}_elf_create_output_section_statements
+     is called before this function, stub_file should already be defined.  */
+  if (!stub_file)
+    {
+      einfo (_("%F%P: cannot create .note section in stub BFD.\n"));
+      return;
+    }
+
+  if (nto_lazy_stack && !link_info.stacksize)
+    {
+      einfo (_("%F%P: error: --lazy-stack must follow -zstack-size=<size>\n"));
+      return;
+    }
+
+  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
+	   | SEC_IN_MEMORY | SEC_LINKER_CREATED);
+  note_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd, ".note", flags);
+  if (! note_sec)
+    {
+      einfo (_("%F%P: failed to create .note section\n"));
+      return;
+    }
+
+  size = offsetof (Elf_External_Note, name[sizeof "QNX"]);
+  size = (size + 3) & -(bfd_size_type) 4;
+  h_size = size;
+  size += sizeof (struct nto_stack_note);
+  note_sec->size = size;
+
+  elf_section_type (note_sec) = SHT_NOTE;
+  note_sec->contents = xmalloc (note_sec->size);
+  e_note = (Elf_External_Note *) note_sec->contents;
+  bfd_h_put_32 (stub_file->the_bfd, sizeof "QNX", &e_note->namesz);
+  bfd_h_put_32 (stub_file->the_bfd, sizeof (struct nto_stack_note), &e_note->descsz);
+  bfd_h_put_32 (stub_file->the_bfd, QNT_STACK, &e_note->type);
+  memcpy (e_note->name, "QNX", sizeof "QNX");
+
+
+  /* Generate .note content.*/
+  n_note = (struct nto_stack_note *) (note_sec->contents + h_size);
+  bfd_h_put_32 (stub_file->the_bfd, link_info.stacksize, &n_note->stacksize);
+
+  if (nto_lazy_stack)
+    bfd_h_put_32 (stub_file->the_bfd, 4096, &n_note->stackalloc);
+  else
+    bfd_h_put_32 (stub_file->the_bfd, link_info.stacksize, &n_note->stackalloc);
+
+  if (link_info.execstack != link_info.noexecstack && link_info.execstack)
+    bfd_h_put_32 (stub_file->the_bfd, 0, &n_note->execstack);
+  else
+    bfd_h_put_32 (stub_file->the_bfd, 1, &n_note->execstack);
+
+}
+
+static void
+nto_create_output_section_statements (void)
+{
+  ${ARCH}_elf_create_output_section_statements ();
+  nto_add_note_section();
+}
+
+EOF
+
+# Define some shell vars to insert bits of code into the standard elf
+# parse_args and list_options functions.
+#
+
+PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
+enum nto_options
+{
+  OPTION_STACK = 500,
+  OPTION_LAZY_STACK,
+};
+'
+
+PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
+  { "stack", required_argument, NULL, OPTION_STACK },
+  { "lazy-stack", no_argument, NULL, OPTION_LAZY_STACK },
+'
+
+PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
+  fprintf (file, _("\
+  --stack <size>              Set size of the initial stack\n\
+  --lazy-stack		      Set lazy allocation of stack\n\
+"));
+'
+
+PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
+    case OPTION_STACK:
+      {
+        char *end;
+        link_info.stacksize = strtoul (optarg, &end, 0);
+        if (*end || link_info.stacksize < 0)
+          einfo (_("%F%P: invalid stack size `%s'\''\n"), optarg + 11);
+        if (!link_info.stacksize)
+          /* Use -1 for explicit no-stack, because zero means
+             'default'.   */
+          link_info.stacksize = -1;
+        break;
+      }
+    case OPTION_LAZY_STACK:
+      nto_lazy_stack = true;
+      break;
+'
+
+# Put these extra Neutrino routines in ld_${EMULATION_NAME}_emulation
+#
+
+LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=nto_create_output_section_statements
diff --git a/ld/testsuite/ld-aarch64/aarch64-nto.exp b/ld/testsuite/ld-aarch64/aarch64-nto.exp
new file mode 100644
index 00000000000..4fd6245e9a2
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/aarch64-nto.exp
@@ -0,0 +1,28 @@
+
+# Expect script for various AARCH64 NTO tests.
+# Copyright (C) 2009-2022 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+# Exclude non-aarch64-NTO targets.
+if { ![istarget "aarch64*-*-nto*"] } {
+    return
+}
+
+run_dump_test "nto-stack-note-1"
+run_dump_test "nto-stack-note-2"
diff --git a/ld/testsuite/ld-aarch64/nto-stack-note-1.d b/ld/testsuite/ld-aarch64/nto-stack-note-1.d
new file mode 100644
index 00000000000..d85dbcadb6b
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/nto-stack-note-1.d
@@ -0,0 +1,12 @@
+#name: nto-stack-note-1
+#source: start.s
+#as:
+#ld: -z stack-size=0x10000
+#readelf: -n
+
+Displaying notes found in: .note
+[ 	]+Owner[ 	]+Data size[ 	]+Description
+  QNX                  0x0000000c	QNX stack
+   Stack Size: 0x10000
+   Stack allocated: 10000
+   Executable: no
diff --git a/ld/testsuite/ld-aarch64/nto-stack-note-2.d b/ld/testsuite/ld-aarch64/nto-stack-note-2.d
new file mode 100644
index 00000000000..9e446ccea5c
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/nto-stack-note-2.d
@@ -0,0 +1,12 @@
+#name: nto-stack-note-2
+#source: start.s
+#as:
+#ld: -z stack-size=0x10000 --lazy-stack -z execstack
+#readelf: -n
+
+Displaying notes found in: .note
+[ 	]+Owner[ 	]+Data size[ 	]+Description
+  QNX                  0x0000000c	QNX stack
+   Stack Size: 0x10000
+   Stack allocated: 1000
+   Executable: yes
diff --git a/ld/testsuite/ld-aarch64/start.s b/ld/testsuite/ld-aarch64/start.s
new file mode 100644
index 00000000000..58d42a60324
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/start.s
@@ -0,0 +1,4 @@
+        .global _start
+        .text
+_start:
+        nop
-- 
2.25.1


  parent reply	other threads:[~2023-03-16 10:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-16 10:17 [PATCH 0/5] Add support for aarch64-nto-qnx Clément Chigot
2023-03-16 10:17 ` [PATCH 1/5] configure: add new target aarch64-*-nto* Clément Chigot
2023-03-16 10:17 ` [PATCH 2/5] readelf: add support for QNT_STACK note subsections Clément Chigot
2023-03-16 10:17 ` Clément Chigot [this message]
2023-03-16 10:17 ` [PATCH 4/5] ld/testsuite: add aarch64nto to ld-aarch64 Clément Chigot
2023-03-16 10:17 ` [PATCH 5/5] ld/testsuite: disable ilp32 tests for aarch64-qnx Clément Chigot
2023-03-16 13:02 ` [PATCH 0/5] Add support for aarch64-nto-qnx Nick Clifton

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=20230316101736.482737-4-chigot@adacore.com \
    --to=chigot@adacore.com \
    --cc=binutils@sourceware.org \
    /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).