Add support for ARCv2

Message ID c28c7427-b426-f859-ce99-e8fa117c8f91@synopsys.com
State Superseded
Headers
Series Add support for ARCv2 |

Commit Message

Shahab Vahedi Oct. 28, 2022, 1:43 p.m. UTC
  This adds support for Synopsys ARCv2 processors. ARC target related
macros has been added to libelf/elf.h. However, there a few changes
on existing ARC macros to correct them and be in sync with binutils.

There are no regressions in tests for an x86_64 build.

==========================================
   elfutils 0.187: tests/test-suite.log
==========================================

.. contents:: :depth: 2

FAIL: run-backtrace-native-core.sh
==================================

backtrace: No modules recognized in core file
backtrace-child-core.8740: no main
rmdir: failed to remove 'test-8732': Directory not empty
FAIL run-backtrace-native-core.sh (exit status: 1)

FAIL: run-backtrace-native-core-biarch.sh
=========================================

backtrace: No modules recognized in core file
backtrace-child-biarch-core.8763: no main
rmdir: failed to remove 'test-8755': Directory not empty
FAIL run-backtrace-native-core-biarch.sh (exit status: 1)

SKIP: run-lfs-symbols.sh
========================

LFS testing is irrelevant on this system
SKIP run-lfs-symbols.sh (exit status: 77)

Signed-off-by: Shahab Vahedi <shahab@synopsys.com>
---
 backends/Makefile.am    |  7 +++-
 backends/arc_init.c     | 55 ++++++++++++++++++++++++++
 backends/arc_reloc.def  | 87 ++++++++++++++++++++++++++++++++++++++++
 backends/arc_symbol.c   | 81 +++++++++++++++++++++++++++++++++++++
 libebl/eblopenbackend.c |  2 +
 libelf/elf.h            | 88 +++++++++++++++++++++++++----------------
 src/elflint.c           |  2 +-
 7 files changed, 286 insertions(+), 36 deletions(-)
 create mode 100644 backends/arc_init.c
 create mode 100644 backends/arc_reloc.def
 create mode 100644 backends/arc_symbol.c

-- 
2.38.1
  

Comments

Shahab Vahedi Oct. 31, 2022, 2:54 p.m. UTC | #1
Hi Mark,

Thank you for response. First and foremost, there is a second iteration of the
patch [1]. I don't want you, or anybody else, waste time looking into v1. The
changes from v1 have been mentioned at the end of v2 commit message.

[1]
https://sourceware.org/pipermail/elfutils-devel/2022q4/005543.html

Regarding your concerns, please find my answers below.

On 10/30/22 02:29, Mark Wielaard wrote:
> On Fri, Oct 28, 2022 at 01:43:49PM +0000, Shahab Vahedi via Elfutils-devel wrote:
>> This adds support for Synopsys ARCv2 processors.
> 
> Is there an easy way to this this (is there a qemu target or a machine
> in the gcc compile farm)?

There is a QEMU target [2]. However, this patch adds a minimal support for ARC.
I'm not quite sure building and running elfutils natively for ARC would test
much at this point. That's why I tested with an x86_64 build with ARC target
support: master + patch -> make check

Unfortunately, there is no machine in GCC's compile farm. There does exist a
pre-built compiler [3] and a repo [4] though.

[2]
https://github.com/foss-for-synopsys-dwc-arc-processors/qemu

[3]
https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/releases/tag/arc-2021.09-release

[4]
https://github.com/foss-for-synopsys-dwc-arc-processors/gcc/tree/arc-2021.09

>> ARC target related
>> macros has been added to libelf/elf.h. However, there a few changes
>> on existing ARC macros to correct them and be in sync with binutils.
> 
> We normally sync with the glibc elf.h, have you submitted these
> changes to libc-alpha?

No, but I intend to. In a v2 of the patch [1], I also have added ChangeLog
entries. It must be easier now to quickly figure out what has changed and
if it's OK or not.

>> There are no regressions in tests for an x86_64 build.
>>
>> ==========================================
>>    elfutils 0.187: tests/test-suite.log
>> ==========================================
>>
>> .. contents:: :depth: 2
>>
>> FAIL: run-backtrace-native-core.sh
>> ==================================
>>
>> backtrace: No modules recognized in core file
>> backtrace-child-core.8740: no main
>> rmdir: failed to remove 'test-8732': Directory not empty
>> FAIL run-backtrace-native-core.sh (exit status: 1)
>>
>> FAIL: run-backtrace-native-core-biarch.sh
>> =========================================
>>
>> backtrace: No modules recognized in core file
>> backtrace-child-biarch-core.8763: no main
>> rmdir: failed to remove 'test-8755': Directory not empty
>> FAIL run-backtrace-native-core-biarch.sh (exit status: 1)
> 
> These two need abi_cfi hooks to describe the DWARF CFI needed to
> unwind.

To be clear, these are the test results on a build without the patch AND
with the patch. I'm not sure why it happens even without the patch on
my system. If you want, I can file a bug report with more details.

-- 
Shahab
  
Mark Wielaard Nov. 1, 2022, 9:01 p.m. UTC | #2
Hi Shahab,

On Mon, Oct 31, 2022 at 02:54:33PM +0000, Shahab Vahedi via Elfutils-devel wrote:
> Thank you for response. First and foremost, there is a second iteration of the
> patch [1]. I don't want you, or anybody else, waste time looking into v1. The
> changes from v1 have been mentioned at the end of v2 commit message.

Thanks.

> There is a QEMU target [2]. However, this patch adds a minimal support for ARC.
> I'm not quite sure building and running elfutils natively for ARC would test
> much at this point. That's why I tested with an x86_64 build with ARC target
> support: master + patch -> make check
> 
> Unfortunately, there is no machine in GCC's compile farm. There does exist a
> pre-built compiler [3] and a repo [4] though.

It might be good to add some tests that can be run on a non ARC
architecture just so people can check they didn't break something. See
e.g. tests/run-strip-reloc.sh tests/run-allregs.sh or
tests/run-addrcfi.sh which take small prebuild object files.

> >> ARC target related
> >> macros has been added to libelf/elf.h. However, there a few changes
> >> on existing ARC macros to correct them and be in sync with binutils.
> > 
> > We normally sync with the glibc elf.h, have you submitted these
> > changes to libc-alpha?
> 
> No, but I intend to. In a v2 of the patch [1], I also have added ChangeLog
> entries. It must be easier now to quickly figure out what has changed and
> if it's OK or not.

Thanks. Normally we wait syncing the elf.h file once a patch lands in glibc.

> >> There are no regressions in tests for an x86_64 build.
> >>
> >> ==========================================
> >>    elfutils 0.187: tests/test-suite.log
> >> ==========================================
> >>
> >> .. contents:: :depth: 2
> >>
> >> FAIL: run-backtrace-native-core.sh
> >> ==================================
> >>
> >> backtrace: No modules recognized in core file
> >> backtrace-child-core.8740: no main
> >> rmdir: failed to remove 'test-8732': Directory not empty
> >> FAIL run-backtrace-native-core.sh (exit status: 1)
> >>
> >> FAIL: run-backtrace-native-core-biarch.sh
> >> =========================================
> >>
> >> backtrace: No modules recognized in core file
> >> backtrace-child-biarch-core.8763: no main
> >> rmdir: failed to remove 'test-8755': Directory not empty
> >> FAIL run-backtrace-native-core-biarch.sh (exit status: 1)
> > 
> > These two need abi_cfi hooks to describe the DWARF CFI needed to
> > unwind.
> 
> To be clear, these are the test results on a build without the patch AND
> with the patch. I'm not sure why it happens even without the patch on
> my system. If you want, I can file a bug report with more details.

Aha, sorry, I missed this was on x86_64. That is indeed odd. If you
could file a bug report with your environment where this fails that
would be good.

Thanks,

Mark
  
Shahab Vahedi Nov. 9, 2022, 4:33 p.m. UTC | #3
Hi Mark,

On 11/1/22 22:01, Mark Wielaard wrote:
> On Mon, Oct 31, 2022 at 02:54:33PM +0000, Shahab Vahedi via Elfutils-devel wrote:
>> To be clear, these are the test results on a build without the patch AND
>> with the patch. I'm not sure why it happens even without the patch on
>> my system. If you want, I can file a bug report with more details.
> 
> Aha, sorry, I missed this was on x86_64. That is indeed odd. If you
> could file a bug report with your environment where this fails that
> would be good.

It has been filed [1].

[1]
https://sourceware.org/bugzilla/show_bug.cgi?id=29767

-- 
Shahab
  
Shahab Vahedi Nov. 30, 2022, 8:15 a.m. UTC | #4
Hi Mark,

On 11/1/22 22:01, Mark Wielaard wrote:
> Thanks. Normally we wait syncing the elf.h file once a patch lands in glibc.

The necessary changes are in glibc now [1]. How/When does the sync happen? Should
I submit a patch, or trigger a request, etc.?

[1] ARC: update definitions in elf/elf.h
https://sourceware.org/git?p=glibc.git;a=commit;h=6ae0737d430

-- 
Shahab
  

Patch

diff --git a/backends/Makefile.am b/backends/Makefile.am
index 9566377f..7f8e47a0 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -37,7 +37,7 @@  AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
 noinst_LIBRARIES = libebl_backends.a libebl_backends_pic.a
 
 modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
-	  m68k bpf riscv csky
+	  m68k bpf riscv csky arc
 
 i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \
 	    i386_retval.c i386_regs.c i386_auxv.c \
@@ -96,11 +96,14 @@  riscv_SRCS = riscv_init.c riscv_symbol.c riscv_cfi.c riscv_regs.c \
 csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \
 	    csky_regs.c csky_initreg.c csky_corenote.c
 
+arc_SRCS = arc_init.c arc_symbol.c
+
 libebl_backends_a_SOURCES = $(i386_SRCS) $(sh_SRCS) $(x86_64_SRCS) \
 			    $(ia64_SRCS) $(alpha_SRCS) $(arm_SRCS) \
 			    $(aarch64_SRCS) $(sparc_SRCS) $(ppc_SRCS) \
 			    $(ppc64_SRCS) $(s390_SRCS) \
-			    $(m68k_SRCS) $(bpf_SRCS) $(riscv_SRCS) $(csky_SRCS)
+			    $(m68k_SRCS) $(bpf_SRCS) $(riscv_SRCS) \
+			    $(csky_SRCS) $(arc_SRCS)
 
 libebl_backends_pic_a_SOURCES =
 am_libebl_backends_pic_a_OBJECTS = $(libebl_backends_a_SOURCES:.c=.os)
diff --git a/backends/arc_init.c b/backends/arc_init.c
new file mode 100644
index 00000000..a013bc4e
--- /dev/null
+++ b/backends/arc_init.c
@@ -0,0 +1,55 @@ 
+/* Initialization of ARC specific backend library.
+   Copyright (C) 2022 Synopsys Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * 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
+
+   or both in parallel, as here.
+
+   elfutils 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 copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND		arc_
+#define RELOC_PREFIX	R_ARC_
+#include "libebl_CPU.h"
+
+/* This defines the common reloc hooks based on arc_reloc.def.  */
+#include "common-reloc.c"
+
+Ebl *
+arc_init (Elf *elf __attribute__ ((unused)),
+	  GElf_Half machine __attribute__ ((unused)),
+	  Ebl *eh)
+{
+  arc_init_reloc (eh);
+  HOOK (eh, machine_flag_check);
+  HOOK (eh, reloc_simple_type);
+  HOOK (eh, section_type_name);
+
+  /* /bld/gcc-stage2/arc-snps-linux-gnu/libgcc/libgcc.map.in
+     #define __LIBGCC_DWARF_FRAME_REGISTERS__.  */
+  eh->frame_nregs = 146;
+
+  return eh;
+}
diff --git a/backends/arc_reloc.def b/backends/arc_reloc.def
new file mode 100644
index 00000000..dfa30629
--- /dev/null
+++ b/backends/arc_reloc.def
@@ -0,0 +1,87 @@ 
+/* List the relocation types for ARC.  -*- C -*-
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * 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
+
+   or both in parallel, as here.
+
+   elfutils 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 copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+/*	    NAME,		REL|EXEC|DYN	*/
+
+RELOC_TYPE (NONE,		EXEC|DYN)
+RELOC_TYPE (8,			REL|EXEC|DYN)
+RELOC_TYPE (16,			REL|EXEC|DYN)
+RELOC_TYPE (24,			REL|EXEC|DYN)
+RELOC_TYPE (32,			REL|EXEC|DYN)
+RELOC_TYPE (N8,			REL|EXEC|DYN)
+RELOC_TYPE (N16,		REL|EXEC|DYN)
+RELOC_TYPE (N24,		REL|EXEC|DYN)
+RELOC_TYPE (N32,		REL|EXEC|DYN)
+RELOC_TYPE (SDA,		REL)
+RELOC_TYPE (SECTOFF,		REL)
+RELOC_TYPE (S21H_PCREL,		REL)
+RELOC_TYPE (S21W_PCREL,		REL)
+RELOC_TYPE (S25H_PCREL,		REL)
+RELOC_TYPE (S25W_PCREL,		REL)
+RELOC_TYPE (SDA32,		REL)
+RELOC_TYPE (SDA_LDST,		REL)
+RELOC_TYPE (SDA_LDST1,		REL)
+RELOC_TYPE (SDA_LDST2,		REL)
+RELOC_TYPE (SDA16_LD,		REL)
+RELOC_TYPE (SDA16_LD1,		REL)
+RELOC_TYPE (SDA16_LD2,		REL)
+RELOC_TYPE (S13_PCREL,		REL)
+RELOC_TYPE (W,			REL)
+RELOC_TYPE (32_ME,		REL)
+RELOC_TYPE (N32_ME,		REL)
+RELOC_TYPE (SECTOFF_ME,		REL)
+RELOC_TYPE (SDA32_ME,		REL)
+RELOC_TYPE (W_ME,		REL)
+RELOC_TYPE (SDA_12,		REL)
+RELOC_TYPE (SDA16_ST2,		REL)
+RELOC_TYPE (32_PCREL,		REL)
+RELOC_TYPE (PC32,		REL)
+RELOC_TYPE (GOTPC32,		REL)
+RELOC_TYPE (PLT32,		REL)
+RELOC_TYPE (COPY,		EXEC|DYN)
+RELOC_TYPE (GLOB_DAT,		EXEC|DYN)
+RELOC_TYPE (JMP_SLOT,		EXEC|DYN)
+RELOC_TYPE (RELATIVE,		EXEC|DYN)
+RELOC_TYPE (GOTOFF,		REL)
+RELOC_TYPE (GOTPC,		REL)
+RELOC_TYPE (GOT32,		REL)
+RELOC_TYPE (S21W_PCREL_PLT,	REL)
+RELOC_TYPE (S25H_PCREL_PLT,	REL)
+RELOC_TYPE (JLI_SECTOFF,	REL)
+RELOC_TYPE (TLS_DTPMOD,		REL)
+RELOC_TYPE (TLS_DTPOFF,		REL)
+RELOC_TYPE (TLS_TPOFF,		REL)
+RELOC_TYPE (TLS_GD_GOT,		REL)
+RELOC_TYPE (TLS_GD_LD,		REL)
+RELOC_TYPE (TLS_GD_CALL,	REL)
+RELOC_TYPE (TLS_IE_GOT,		REL)
+RELOC_TYPE (TLS_DTPOFF_S9,	REL)
+RELOC_TYPE (TLS_LE_S9,		REL)
+RELOC_TYPE (TLS_LE_32,		REL)
+RELOC_TYPE (S25W_PCREL_PLT,	REL)
+RELOC_TYPE (S21H_PCREL_PLT,	REL)
+RELOC_TYPE (NPS_CMEM16,		REL)
diff --git a/backends/arc_symbol.c b/backends/arc_symbol.c
new file mode 100644
index 00000000..e996c5d9
--- /dev/null
+++ b/backends/arc_symbol.c
@@ -0,0 +1,81 @@ 
+/* ARC specific symbolic name handling.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * 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
+
+   or both in parallel, as here.
+
+   elfutils 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 copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <elf.h>
+#include <stddef.h>
+#include <string.h>
+
+#define BACKEND arc_
+#include "libebl_CPU.h"
+
+
+/* Check whether machine flags are valid.  */
+bool
+arc_machine_flag_check (GElf_Word flags)
+{
+  return ((flags &~ EF_ARC_ALL_MSK) == 0);
+}
+
+/* Check for the simple reloc types.  */
+Elf_Type
+arc_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type,
+		       int *addsub __attribute ((unused)))
+{
+  switch (type)
+    {
+    case R_ARC_32:
+      return ELF_T_WORD;
+    case R_ARC_16:
+      return ELF_T_HALF;
+    case R_ARC_8:
+      return ELF_T_BYTE;
+    default:
+      return ELF_T_NUM;
+    }
+}
+
+/* Return symbolic representation of section type.  */
+const char *
+arc_section_type_name (int type,
+		       char *buf __attribute__ ((unused)),
+		       size_t len __attribute__ ((unused)))
+{
+  switch (type)
+    {
+    case SHT_ARC_ATTRIBUTES:
+      return "ARC_ATTRIBUTES";
+    default:
+      break;
+    }
+
+  return NULL;
+}
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 02f80653..f2288f63 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -55,6 +55,7 @@  Ebl *m68k_init (Elf *, GElf_Half, Ebl *);
 Ebl *bpf_init (Elf *, GElf_Half, Ebl *);
 Ebl *riscv_init (Elf *, GElf_Half, Ebl *);
 Ebl *csky_init (Elf *, GElf_Half, Ebl *);
+Ebl *arc_init (Elf *, GElf_Half, Ebl *);
 
 /* This table should contain the complete list of architectures as far
    as the ELF specification is concerned.  */
@@ -150,6 +151,7 @@  static const struct
   { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS64, ELFDATA2LSB },
   { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS32, ELFDATA2LSB },
   { csky_init, "elf_csky", "csky", 4, EM_CSKY, ELFCLASS32, ELFDATA2LSB },
+  { arc_init, "elf_arc", "arc", 3, EM_ARCV2, ELFCLASS32, ELFDATA2LSB },
 };
 #define nmachines (sizeof (machines) / sizeof (machines[0]))
 
diff --git a/libelf/elf.h b/libelf/elf.h
index 02a1b3f5..8428e3df 100644
--- a/libelf/elf.h
+++ b/libelf/elf.h
@@ -4148,24 +4148,48 @@  enum
 #define R_LARCH_GNU_VTINHERIT  57
 #define R_LARCH_GNU_VTENTRY  58
 
+/* ARC specific declarations.  */
+
+/* Processor specific flags for the Ehdr e_flags field.  */
+#define EF_ARC_MACH_MSK     0x000000ff
+#define EF_ARC_OSABI_MSK    0x00000f00
+#define EF_ARC_ALL_MSK      (EF_ARC_MACH_MSK | EF_ARC_OSABI_MSK)
+
+/* Various CPU types.  These numbers are exposed in the ELF header flags
+   (e_flags field), and so must never change.  */
+#define E_ARC_MACH_ARC600	0x00000002
+#define E_ARC_MACH_ARC601	0x00000004
+#define E_ARC_MACH_ARC700	0x00000003
+#define EF_ARC_CPU_ARCV2EM      0x00000005
+#define EF_ARC_CPU_ARCV2HS      0x00000006
+#define EF_ARC_CPU_ARC64	0x00000007
+
+/* ARC Linux specific ABIs.  */
+#define E_ARC_OSABI_ORIG	0x00000000   /* MUST be 0 for back-compat.  */
+#define E_ARC_OSABI_V2		0x00000200
+#define E_ARC_OSABI_V3		0x00000300
+#define E_ARC_OSABI_V4		0x00000400
+#define E_ARC_OSABI_CURRENT	E_ARC_OSABI_V4
+/* Leave bits 0xf0 alone in case we ever have more than 16 cpu types.  */
+
+/* Additional section types.  */
+#define SHT_ARC_ATTRIBUTES     0x70000001	/* Section holds attributes.  */
 
 /* ARCompact/ARCv2 specific relocs.  */
-#define R_ARC_NONE		0x0
-#define R_ARC_8			0x1
-#define R_ARC_16		0x2
-#define R_ARC_24		0x3
-#define R_ARC_32		0x4
-#define R_ARC_B26		0x5
-#define R_ARC_B22_PCREL		0x6
-#define R_ARC_H30		0x7
-#define R_ARC_N8		0x8
-#define R_ARC_N16		0x9
-#define R_ARC_N24		0xA
-#define R_ARC_N32		0xB
-#define R_ARC_SDA		0xC
-#define R_ARC_SECTOFF		0xD
-#define R_ARC_S21H_PCREL	0xE
-#define R_ARC_S21W_PCREL	0xF
+#define R_ARC_NONE		0x00
+#define R_ARC_8			0x01
+#define R_ARC_16		0x02
+#define R_ARC_24		0x03
+#define R_ARC_32		0x04
+
+#define R_ARC_N8		0x08
+#define R_ARC_N16		0x09
+#define R_ARC_N24		0x0A
+#define R_ARC_N32		0x0B
+#define R_ARC_SDA		0x0C
+#define R_ARC_SECTOFF		0x0D
+#define R_ARC_S21H_PCREL	0x0E
+#define R_ARC_S21W_PCREL	0x0F
 #define R_ARC_S25H_PCREL	0x10
 #define R_ARC_S25W_PCREL	0x11
 #define R_ARC_SDA32		0x12
@@ -4182,29 +4206,24 @@  enum
 #define R_ARC_SECTOFF_ME	0x1D
 #define R_ARC_SDA32_ME		0x1E
 #define R_ARC_W_ME		0x1F
-#define R_ARC_H30_ME		0x20
-#define R_ARC_SECTOFF_U8	0x21
-#define R_ARC_SECTOFF_S9	0x22
-#define R_AC_SECTOFF_U8		0x23
-#define R_AC_SECTOFF_U8_1	0x24
-#define R_AC_SECTOFF_U8_2	0x25
-#define R_AC_SECTOFF_S9		0x26
-#define R_AC_SECTOFF_S9_1	0x27
-#define R_AC_SECTOFF_S9_2	0x28
-#define R_ARC_SECTOFF_ME_1	0x29
-#define R_ARC_SECTOFF_ME_2	0x2A
-#define R_ARC_SECTOFF_1		0x2B
-#define R_ARC_SECTOFF_2		0x2C
+
+#define R_ARC_SDA_12		0x2D
+#define R_ARC_SDA16_ST2		0x30
+#define R_ARC_32_PCREL		0x31
 #define R_ARC_PC32		0x32
 #define R_ARC_GOTPC32		0x33
 #define R_ARC_PLT32		0x34
 #define R_ARC_COPY		0x35
 #define R_ARC_GLOB_DAT		0x36
-#define R_ARC_JUMP_SLOT		0x37
+#define R_ARC_JMP_SLOT		0x37
 #define R_ARC_RELATIVE		0x38
 #define R_ARC_GOTOFF		0x39
 #define R_ARC_GOTPC		0x3A
 #define R_ARC_GOT32		0x3B
+#define R_ARC_S21W_PCREL_PLT	0x3C
+#define R_ARC_S25H_PCREL_PLT	0x3D
+
+#define R_ARC_JLI_SECTOFF	0x3F
 
 #define R_ARC_TLS_DTPMOD	0x42
 #define R_ARC_TLS_DTPOFF	0x43
@@ -4213,9 +4232,12 @@  enum
 #define R_ARC_TLS_GD_LD	        0x46
 #define R_ARC_TLS_GD_CALL	0x47
 #define R_ARC_TLS_IE_GOT	0x48
-#define R_ARC_TLS_DTPOFF_S9	0x4a
-#define R_ARC_TLS_LE_S9		0x4a
-#define R_ARC_TLS_LE_32		0x4b
+#define R_ARC_TLS_DTPOFF_S9	0x49
+#define R_ARC_TLS_LE_S9		0x4A
+#define R_ARC_TLS_LE_32		0x4B
+#define R_ARC_S25W_PCREL_PLT	0x4C
+#define R_ARC_S21H_PCREL_PLT	0x4D
+#define R_ARC_NPS_CMEM16	0x4E
 
 /* OpenRISC 1000 specific relocs.  */
 #define R_OR1K_NONE		0
diff --git a/src/elflint.c b/src/elflint.c
index 565cffdc..71521d6a 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -329,7 +329,7 @@  static const int valid_e_machine[] =
     EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM,
     EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300,
     EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA,
-    EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY
+    EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY, EM_ARC
   };
 #define nvalid_e_machine \
   (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))