[PATCH] alpha: Remove ECOFF support from `objstrip'

From: Maciej W. Rozycki
Date: Sun Apr 09 2023 - 16:31:19 EST


Due to the UAPI <linux/a.out.h> header only being installed for a small
number of hosts (namely alpha, m68k and x86, according to a rule from
include/uapi/Kbuild), `make bootpfile' fails when building `objstrip'
tool in a cross-build of an Alpha kernel on a build system that is not
one of those that have the header installed:

arch/alpha/boot/tools/objstrip.c:26:10: fatal error: linux/a.out.h: No such file or directory
26 | #include <linux/a.out.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.host:110: arch/alpha/boot/tools/objstrip] Error 1
make: *** [arch/alpha/Makefile:54: bootpfile] Error 2

(here reported with a ppc64le system).

Now `objstrip' is a cross-tool in this context and shouldn't be using
<linux/a.out.h> and ultimately <asm/a.out.h> installed system-wide, as
if present, these describe the native system they have been installed
on, which is not necessarily alpha. Instead `objstrip' would have to
refer to arch/alpha/include/uapi/asm/a.out.h somehow.

However we have actually long dropped support for building `vmlinux' as
an ECOFF executable for Alpha, as far back as in 1997, with 2.1.36. So
instead just drop ECOFF support from `objstrip', fixing the compilation
error.

Signed-off-by: Maciej W. Rozycki <macro@xxxxxxxxxxx>
---
For posterity on using MOP to boot Linux on Alpha:

The resulting image boots (with an AlphaServer 300/266), so I think the
change is good. It does not boot directly though, owing to the age of the
SRM console:

>>>show version
version X3.7-10895 Sep 15 1994 10:19:05
>>>

which does not support BOOTP (it accepts `boot -protocols bootp', but it
fails, looping indefinitely and never ever sending any network traffic).
The image can be converted to an ELF executable suitable to load via MOP
with Linux `mopd' though, as follows:

$ alpha-linux-gnu-objcopy -I binary -O elf64-alpha --rename-section .data=.text,alloc,code,contents,load,readonly arch/alpha/boot/bootpfile arch/alpha/boot/bootpfile.o
$ alpha-linux-gnu-ld -N -Ttext 0x20000000 -e 0x20000000 arch/alpha/boot/bootpfile.o -o arch/alpha/boot/bootpfile.elf

and then resulting `bootpfile.elf' image can be supplied to `mopd' and SRM
will happily load and run it:

>>>boot ewa0 -fl "ip=bootp root=/dev/nfs rw console=ttyS0"
(boot ewa0.0.0.11.0 -flags ip=bootp root=/dev/nfs rw console=ttyS0)

Trying MOP boot.
...............................................................................................................................................................................................

Network load complete.
Host name: macro.orcam.me.uk
Host address: 00-01-02-85-ca-6e

bootstrap code read in
base = 11e000, image_start = 0, image_bytes = bd5378
initializing HWRPB at 2000
initializing page table at 110000
initializing machine state
setting affinity to the primary CPU
jumping to bootstrap code
Linux/AXP bootp loader for Linux 6.3.0-rc5-dirty
Switching to OSF PAL-code .. Ok (rev 1000000020123)
Loading the kernel...'ip=bootp root=/dev/nfs rw console=ttyS0'
Linux version 6.3.0-rc5-dirty (macro@angie) (alpha-linux-gnu-gcc (GCC) 12.0.1 20220129 (experimental), GNU ld (GNU Binutils) 2.37.50.20211101) #6 Tue Apr 4 23:32:30 BST 2023
Booting on Avanti using machine vector Avanti from SRM
Major Options: LEGACY_START VERBOSE_MCHECK MAGIC_SYSRQ
Command line: ip=bootp root=/dev/nfs rw console=ttyS0
[...]
---
arch/alpha/boot/tools/objstrip.c | 57 +++++++--------------------------------
1 file changed, 11 insertions(+), 46 deletions(-)

linux-alpha-boot-objstrip-aout.diff
Index: linux-macro/arch/alpha/boot/tools/objstrip.c
===================================================================
--- linux-macro.orig/arch/alpha/boot/tools/objstrip.c
+++ linux-macro/arch/alpha/boot/tools/objstrip.c
@@ -2,13 +2,13 @@
/*
* arch/alpha/boot/tools/objstrip.c
*
- * Strip the object file headers/trailers from an executable (ELF or ECOFF).
+ * Strip the object file headers/trailers from an ELF executable.
*
* Copyright (C) 1996 David Mosberger-Tang.
*/
/*
- * Converts an ECOFF or ELF object file into a bootable file. The
- * object file must be a OMAGIC file (i.e., data and bss follow immediately
+ * Converts an ELF object file into a bootable file. The object
+ * file must be a OMAGIC file (i.e., data and bss follow immediately
* behind the text). See DEC "Assembly Language Programmer's Guide"
* documentation for details. The SRM boot process is documented in
* the Alpha AXP Architecture Reference Manual, Second Edition by
@@ -23,15 +23,11 @@
#include <sys/stat.h>
#include <sys/types.h>

-#include <linux/a.out.h>
-#include <linux/coff.h>
#include <linux/param.h>
-#ifdef __ELF__
-# include <linux/elf.h>
-# define elfhdr elf64_hdr
-# define elf_phdr elf64_phdr
-# define elf_check_arch(x) ((x)->e_machine == EM_ALPHA)
-#endif
+#include <linux/elf.h>
+#define elfhdr elf64_hdr
+#define elf_phdr elf64_phdr
+#define elf_check_arch(x) ((x)->e_machine == EM_ALPHA)

/* bootfile size must be multiple of BLOCK_SIZE: */
#define BLOCK_SIZE 512
@@ -55,13 +51,10 @@ main (int argc, char *argv[])
size_t nwritten, tocopy, n, mem_size, fil_size, pad = 0;
int fd, ofd, i, j, verbose = 0, primary = 0;
char buf[8192], *inname;
- struct exec * aout; /* includes file & aout header */
long offset;
-#ifdef __ELF__
struct elfhdr *elf;
struct elf_phdr *elf_phdr; /* program header */
unsigned long long e_entry;
-#endif

prog_name = argv[0];

@@ -145,7 +138,6 @@ main (int argc, char *argv[])
exit(1);
}

-#ifdef __ELF__
elf = (struct elfhdr *) buf;

if (memcmp(&elf->e_ident[EI_MAG0], ELFMAG, SELFMAG) == 0) {
@@ -192,37 +184,10 @@ main (int argc, char *argv[])
prog_name, (long) elf_phdr->p_vaddr,
elf_phdr->p_vaddr + fil_size, offset);
}
- } else
-#endif
- {
- aout = (struct exec *) buf;
-
- if (!(aout->fh.f_flags & COFF_F_EXEC)) {
- fprintf(stderr, "%s: %s is not in executable format\n",
- prog_name, inname);
- exit(1);
- }
-
- if (aout->fh.f_opthdr != sizeof(aout->ah)) {
- fprintf(stderr, "%s: %s has unexpected optional header size\n",
- prog_name, inname);
- exit(1);
- }
-
- if (N_MAGIC(*aout) != OMAGIC) {
- fprintf(stderr, "%s: %s is not an OMAGIC file\n",
- prog_name, inname);
- exit(1);
- }
- offset = N_TXTOFF(*aout);
- fil_size = aout->ah.tsize + aout->ah.dsize;
- mem_size = fil_size + aout->ah.bsize;
-
- if (verbose) {
- fprintf(stderr, "%s: extracting %#016lx-%#016lx (at %lx)\n",
- prog_name, aout->ah.text_start,
- aout->ah.text_start + fil_size, offset);
- }
+ } else {
+ fprintf(stderr, "%s: %s is not in executable format\n",
+ prog_name, inname);
+ exit(1);
}

if (lseek(fd, offset, SEEK_SET) != offset) {