[Bug libdw/27405] libdw_get_srcfiles should not imply srclines

2024-03-28 Thread amerey at redhat dot com
https://sourceware.org/bugzilla/show_bug.cgi?id=27405

Aaron Merey  changed:

   What|Removed |Added

 CC||amerey at redhat dot com

--- Comment #2 from Aaron Merey  ---
Proposed patch:
https://sourceware.org/pipermail/elfutils-devel/2024q1/006973.html

-- 
You are receiving this mail because:
You are on the CC list for the bug.

[PATCH] libdw: dwarf_getsrcfiles should not imply dwarf_getsrclines

2024-03-28 Thread Aaron Merey
dwarf_getsrcfiles causes line data to be read in addition to file data.
This is wasteful for programs which only need file or directory names.
Debuginfod server is one such example.

Fix this by moving the srcfile handling in read_srclines into a separate
function read_srcfiles.

read_srclines also no longer handles DW_LNE_define_file due to lack of
use and to simplify the separation of srcfile and srcline reading.

* libdw/dwarf_getsrcfiles.c (dwarf_getsrcfiles): Replace
dwarf_getsrclines and __libdw_getsrclines with
__libdw_getsrcfiles.
* libdw/dwarf_getsrclines.c (read_line_header): New function.
(read_srcfiles): New function.
(read_srclines): Move file reading into read_srcfiles.
Remove DW_LNE_define_file handling.  Add parameter so
that previously read srcfiles can be used if available.
(__libdw_getsrclines): Call read_srcfiles if linesp is
NULL.  Pass previously read srcfiles to read_srclines
if available.
(__libdw_getsrcfiles): New function.
* libdw/dwarf_macro_getsrcfiles.c (dwarf_macro_getsrcfiles):
Replace __libdw_getsrclines with __libdw_getsrcfiles.
* libdw/libdwP.h (__libdw_getsrcfiles): New declaration.
* tests/get-files.c: Verify that dwarf_getsrcfiles does
not cause srclines to be read.
* tests/get-lines.c: Verify that srclines can be read
after srcfiles have been read.

https://sourceware.org/bugzilla/show_bug.cgi?id=27405

Signed-off-by: Aaron Merey 
---
 libdw/dwarf_getsrcfiles.c   |  24 +-
 libdw/dwarf_getsrclines.c   | 506 ++--
 libdw/dwarf_macro_getsrcfiles.c |   4 +-
 libdw/libdwP.h  |  10 +
 tests/get-files.c   |   8 +
 tests/get-lines.c   |  20 +-
 6 files changed, 346 insertions(+), 226 deletions(-)

diff --git a/libdw/dwarf_getsrcfiles.c b/libdw/dwarf_getsrcfiles.c
index cd2e5b5a..24e4b7d2 100644
--- a/libdw/dwarf_getsrcfiles.c
+++ b/libdw/dwarf_getsrcfiles.c
@@ -70,10 +70,9 @@ dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, 
size_t *nfiles)
{
  /* We are only interested in the files, the lines will
 always come from the skeleton.  */
- res = __libdw_getsrclines (cu->dbg, dwp_off,
+ res = __libdw_getsrcfiles (cu->dbg, dwp_off,
 __libdw_getcompdir (cudie),
-cu->address_size, NULL,
->files);
+cu->address_size, >files);
}
}
  else
@@ -89,12 +88,19 @@ dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, 
size_t *nfiles)
}
   else
{
- Dwarf_Lines *lines;
- size_t nlines;
-
- /* Let the more generic function do the work.  It'll create more
-data but that will be needed in an real program anyway.  */
- res = INTUSE(dwarf_getsrclines) (cudie, , );
+ /* The die must have a statement list associated.  */
+ Dwarf_Attribute stmt_list_mem;
+ Dwarf_Attribute *stmt_list = INTUSE(dwarf_attr) (cudie, 
DW_AT_stmt_list,
+  _list_mem);
+
+ Dwarf_Off debug_line_offset;
+ if (__libdw_formptr (stmt_list, IDX_debug_line, DWARF_E_NO_DEBUG_LINE,
+  NULL, _line_offset) == NULL)
+   return -1;
+
+ res = __libdw_getsrcfiles (cu->dbg, debug_line_offset,
+__libdw_getcompdir (cudie),
+cu->address_size, >files);
}
 }
   else if (cu->files != (void *) -1l)
diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c
index 69e10c7b..4eda13f4 100644
--- a/libdw/dwarf_getsrclines.c
+++ b/libdw/dwarf_getsrclines.c
@@ -77,6 +77,28 @@ compare_lines (const void *a, const void *b)
 : 0;
 }
 
+/* Decoded .debug_line program header.  */
+struct line_header
+{
+  /* Header entries */
+  Dwarf_Word unit_length;
+  unsigned int length;
+  uint_fast16_t version;
+  size_t line_address_size;
+  size_t segment_selector_size;
+  Dwarf_Word header_length;
+  const unsigned char *header_start;
+  uint_fast8_t minimum_instr_len;
+  uint_fast8_t max_ops_per_instr;
+  uint_fast8_t default_is_stmt;
+  int_fast8_t line_base;
+  uint_fast8_t line_range;
+  uint_fast8_t opcode_base;
+  const uint8_t *standard_opcode_lengths;
+  unsigned int debug_str_offset;  /* CUBIN only */
+  size_t files_start;
+};
+
 struct line_state
 {
   Dwarf_Word addr;
@@ -155,127 +177,81 @@ add_new_line (struct line_state *state, struct linelist 
*new_line)
   return false;
 }
 
+/* Cache the .debug_line header.  Return 0 if sucessful, otherwise set
+   libdw errno and return -1.  */
+
 static int
-read_srclines (Dwarf *dbg,
-  

Re: [PATCH v3 1/6] Support Mips architecture

2024-03-28 Thread Mark Wielaard
Hi Ying,

On Tue, Mar 05, 2024 at 05:51:17PM +0800, Ying Huang wrote:
> From: Ying Huang 
> 
> Signed-off-by: Ying Huang 
> ---
>  backends/Makefile.am|   6 +-
>  backends/mips_init.c|  52 
>  backends/mips_reloc.def |  93 +++
>  backends/mips_symbol.c  |  63 +
>  libebl/eblopenbackend.c |   2 +
>  libelf/libelfP.h|   3 +
>  tests/libelf.h  | 541 

Note that this adds tests/libelf.h by accident.  I see how that could
happen, because it should have been in .gitignore.  I posted a patch
to do that:
https://inbox.sourceware.org/elfutils-devel/20240328234308.1032110-1-m...@klomp.org/

Besides that the patch looks fine. I did add a ChangeLog entry to the
commit message. Pushed as attached.

Thanks,

Mark
>From e259f126f5077923e415e306915de50ed0f0db56 Mon Sep 17 00:00:00 2001
From: Ying Huang 
Date: Tue, 5 Mar 2024 17:51:17 +0800
Subject: [PATCH] Support Mips architecture

* backends/Makefile.am (modules): Add mips.
(mips_SRCS): New var for mips_init.c mips_symbol.c.
(libebl_backends_a_SOURCES): Add mips_SRCS.
* backends/mips_init.c: New file.
* backends/mips_reloc.def: Likewise.
* backends/mips_symbol.c: Likewise.
* libebl/eblopenbackend.c (mips_init): Declare.
(machines): Add mips.
* libelf/libelfP.h: Add ELF64_MIPS_R_TYPE{1,2,3}

Signed-off-by: Ying Huang 
---
 backends/Makefile.am|  6 ++-
 backends/mips_init.c| 52 +++
 backends/mips_reloc.def | 93 +
 backends/mips_symbol.c  | 63 
 libebl/eblopenbackend.c |  2 +
 libelf/libelfP.h|  3 ++
 6 files changed, 217 insertions(+), 2 deletions(-)
 create mode 100644 backends/mips_init.c
 create mode 100644 backends/mips_reloc.def
 create mode 100644 backends/mips_symbol.c

diff --git a/backends/Makefile.am b/backends/Makefile.am
index bbb2aac79ab8..b946fd30495f 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 loongarch arc
+ m68k bpf riscv csky loongarch arc mips
 
 i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \
i386_retval.c i386_regs.c i386_auxv.c \
@@ -102,12 +102,14 @@ loongarch_SRCS = loongarch_init.c loongarch_symbol.c 
loongarch_cfi.c \
 
 arc_SRCS = arc_init.c arc_symbol.c
 
+mips_SRCS = mips_init.c mips_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) 
\
-   $(loongarch_SRCS) $(arc_SRCS)
+   $(loongarch_SRCS) $(arc_SRCS) $(mips_SRCS)
 
 libebl_backends_pic_a_SOURCES =
 am_libebl_backends_pic_a_OBJECTS = $(libebl_backends_a_SOURCES:.c=.os)
diff --git a/backends/mips_init.c b/backends/mips_init.c
new file mode 100644
index ..cedd08ca1339
--- /dev/null
+++ b/backends/mips_init.c
@@ -0,0 +1,52 @@
+/* Initialization of MIPS specific backend library.
+   Copyright (C) 2024 CIP United 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 .  */
+
+#ifdef HAVE_CONFIG_H
+# include 
+#endif
+
+#define BACKENDmips_
+#define RELOC_PREFIX   R_MIPS_
+#include "libebl_CPU.h"
+#include "libelfP.h"
+
+#define RELOC_TYPE_ID(type) ((type) & 0xff)
+
+/* This defines the common reloc hooks based on mips_reloc.def.  */
+#include "common-reloc.c"
+
+Ebl *
+mips_init (Elf *elf __attribute__ ((unused)),
+  GElf_Half machine __attribute__ ((unused)),
+  Ebl *eh)
+{
+  /* We handle it.  */
+  mips_init_reloc (eh);
+  HOOK (eh, 

[PATCH] tests, config: Add more .gitignore files

2024-03-28 Thread Mark Wielaard
Some new tests and one configure file weren't in .gitignore. Also
we made a copy of libelf.h in tests/ which should be an symlink.

* config/.gitignore: Add profile.fish.
* tests/.gitignore: Add funcretval_test_struct, libelf.h
and system-elf-gelf-test.
* tests/Makefile.am (libelf.h): Make symlink instead of copy.

Signed-off-by: Mark Wielaard 
---
 config/.gitignore | 1 +
 tests/.gitignore  | 3 +++
 tests/Makefile.am | 2 +-
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/config/.gitignore b/config/.gitignore
index 8cd8ccdbf3c1..b7897159babf 100644
--- a/config/.gitignore
+++ b/config/.gitignore
@@ -11,5 +11,6 @@
 /missing
 /profile.csh
 /profile.sh
+/profile.fish
 /test-driver
 /ylwrap
diff --git a/tests/.gitignore b/tests/.gitignore
index 0289959d73d5..772c7881ae3f 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -71,6 +71,7 @@
 /find-prologues
 /funcretval
 /funcretval_test++11
+/funcretval_test_struct
 /funcscopes
 /get-aranges
 /get-files
@@ -81,6 +82,7 @@
 /getphdrnum
 /getsrc_die
 /hash
+/libelf.h
 /leb128
 /line2addr
 /low_high_pc
@@ -104,6 +106,7 @@
 /showptable
 /strptr
 /system-elf-libelf-test
+/system-elf-gelf-test
 /test-elf_cntl_gelf_getshdr
 /test-flag-nobits
 /test-nlist
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 344d6706e16e..40e0eaa5a368 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -841,7 +841,7 @@ declfiles_LDADD = $(libdw)
 BUILT_SOURCES = libelf.h
 CLEANFILES += libelf.h
 libelf.h: $(top_srcdir)/libelf/libelf.h
-   cp $< $@
+   ln -s $< $@
 if !INSTALL_ELFH
 system_elf_libelf_test_CPPFLAGS =
 system_elf_gelf_test_CPPFLAGS = -I.
-- 
2.39.3



Re: [PATCH 0/2] Add initial support for Hexagon

2024-03-28 Thread Matheus Bernardino

Hi, Mark

Thanks for the comments.

On 3/28/24 8:45 AM, Mark Wielaard wrote:

Hi Matheus,

The only issue is that we like to keep libelf/elf.h synced with glibc
elf/elf.h. Would it be possible/make sense to submit the elf.h changes
to libc-alpha? Otherwise we should keep the new constants in some
other file (maybe libelf/elf-knowledge.h)?


Ah, I see. We don't plan on supporting Hexagon on other libc's as of 
this moment, so it would be good if we can add these constants to 
libelf/elf-knowledge.h, like you suggested.



Is there a public psabi for Hexagon? Then including an URL to it would
be helpful.


Yes, it's available at: 
https://lists.llvm.org/pipermail/llvm-dev/attachments/20190916/21516a52/attachment-0001.pdf


(I'll add it to the commit message as well.)


If possible you might want to include some simple test file. See
tests/run-strip-reloc-ko.sh



Sure, will do!


Thanks,

Matheus



Re: [PATCH] nm: Fix descriptor leak

2024-03-28 Thread Mark Wielaard
Hi,

On Thu, Mar 28, 2024 at 11:49:58PM +0300, Maks Mishin wrote:
> The descriptor 'dwfl_fd' is created at nm.c:1278 by calling
> function 'dup' and lost at nm.c:1593.

Sorry, I don't follow, the code at nm.c:1278 says:

  /* Duplicate an fd for dwfl_report_offline to swallow.  */
  int dwfl_fd = dup (fd);
  if (likely (dwfl_fd >= 0))

And then the code tracks whether the dwfl_report_offline call is
executed successfully and otherwise closed dwfl_fd. Specifically the
code does:

  if (dwfl_report_offline (dwfl, fname, fname, dwfl_fd)
  == NULL)
{
  /* Consumed on success, not on failure.  */
  close (dwfl_fd);
}

The dwfl_report functions are documented as "On success, FD is
consumed by the library". Which means fd is freed/closed when dwfl_end
is called.

> Found by RASU JSC.
> 
> Signed-off-by: Maks Mishin 
> ---
>  src/nm.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/src/nm.c b/src/nm.c
> index 3675f59b..fee397dd 100644
> --- a/src/nm.c
> +++ b/src/nm.c
> @@ -1521,6 +1521,8 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehdr *ehdr,
>  }
>if (dwfl != NULL)
>  dwfl_end (dwfl);
> +  if (dwfl_fd != NULL)
> +close(dwfl_fd);
>  }

So this would double close dwfl_fd.  Also dwfl_fd is an int (file
descriptor) and so shouldn't be compared to NULL, but checked as above
(dwfl_fd >= 0).


Re: [PATCH] segment: Fix dangling pointer

2024-03-28 Thread Mark Wielaard
Hi Maks,

On Thu, Mar 28, 2024 at 11:29:22PM +0300, Maks Mishin wrote:
> Pointer 'lookup_module' which is a field of the structure 'Dwfl'
> freed at segment.c:88 is not overwritten, but it is usually overwritten
> after free.

But the very next statement is a return true; so old isn't in scope
anymore. Why would we assign NULL to it?

> Found by RASU JSC.

What or who is that?

> Signed-off-by: Maks Mishin 
> ---
>  libdwfl/segment.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/libdwfl/segment.c b/libdwfl/segment.c
> index f6a3e84e..af76f2f8 100644
> --- a/libdwfl/segment.c
> +++ b/libdwfl/segment.c
> @@ -86,6 +86,7 @@ insert (Dwfl *dwfl, size_t i, GElf_Addr start, GElf_Addr 
> end, int segndx)
> if (unlikely (dwfl->lookup_module == NULL))
>   {
> free (old);
> +   old = NULL;
> return true;
>   }
>   }
> -- 
> 2.30.2
> 


[PATCH] nm: Fix descriptor leak

2024-03-28 Thread Maks Mishin
The descriptor 'dwfl_fd' is created at nm.c:1278 by calling
function 'dup' and lost at nm.c:1593.

Found by RASU JSC.

Signed-off-by: Maks Mishin 
---
 src/nm.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/nm.c b/src/nm.c
index 3675f59b..fee397dd 100644
--- a/src/nm.c
+++ b/src/nm.c
@@ -1521,6 +1521,8 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehdr *ehdr,
 }
   if (dwfl != NULL)
 dwfl_end (dwfl);
+  if (dwfl_fd != NULL)
+close(dwfl_fd);
 }
 
 
-- 
2.30.2



[PATCH] segment: Fix dangling pointer

2024-03-28 Thread Maks Mishin
Pointer 'lookup_module' which is a field of the structure 'Dwfl'
freed at segment.c:88 is not overwritten, but it is usually overwritten
after free.

Found by RASU JSC.

Signed-off-by: Maks Mishin 
---
 libdwfl/segment.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libdwfl/segment.c b/libdwfl/segment.c
index f6a3e84e..af76f2f8 100644
--- a/libdwfl/segment.c
+++ b/libdwfl/segment.c
@@ -86,6 +86,7 @@ insert (Dwfl *dwfl, size_t i, GElf_Addr start, GElf_Addr end, 
int segndx)
  if (unlikely (dwfl->lookup_module == NULL))
{
  free (old);
+ old = NULL;
  return true;
}
}
-- 
2.30.2



Elfutils Code of Conduct

2024-03-28 Thread Aaron Merey
Hi all,

I'd like to propose a formal code of conduct for elfutils.  Elfutils
already has a brief, informal code of conduct.  The CONTRIBUTING
document in the elfutils source directory states that:

   committers/maintainers who repeatedly ignore the above guidelines,
   are hostile or offensive towards other committers or contributors,
   and don't correct their behavior after being asked by other committers
   will be removed as maintainer/committer.

I'd like to replace this with a more formal code of conduct that applies
to anyone participating in the elfutils community and better describes the
types of behaviors that are either encouraged or unwelcome.  The code of
conduct should also outline how complaints will be handled and who is
responsible for enforcement.

The Contributor Covenant [1] is a code of conduct that I believe satisfies
these goals.  Mark has already recommended that elfutils adopt the
Contributor Covenant [2].  It is also used by a variety of open source
projects including Golang, Curl and the Linux kernel.

This code of conduct includes a committee to handle any complaints or
concerns that fall under the code.  Mark and I have offered to be on this
committee.  If anyone else would like to be a member of the elfutils code
of conduct committee, please let us know!

I've included the text of Contributor Covenant v2.1 below with changes
to the following sections:

Enforcement Responsibilities: Clarified who is a "community leader".
Scope: Used examples specific to elfutils.
Enforcement: Mention our code of conduct committee and names of members.

Any other comments or questions regarding an elfutils code of conduct are
also welcome.

Aaron

[1] https://www.contributor-covenant.org/
[2] 
https://inbox.sourceware.org/elfutils-devel/63f6aa114966e0d49d18497c336afa8d3965e24d.ca...@klomp.org/#t

---

# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in
our community a harassment-free experience for everyone, regardless of
age, body size, visible or invisible disability, ethnicity, sex
characteristics, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance,
race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political
  attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders (i.e. regular contributors and/or those with elfutils
git commit access) are responsible for clarifying and enforcing our standards
of acceptable behavior and will take appropriate and fair corrective action
in response to any behavior that they deem inappropriate, threatening,
offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, and will communicate reasons
for moderation decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, such as the
elfutils IRC channel, website, mailing list and bug reports. It also
applies when an individual is officially representing the community
in public spaces. Examples of representing our community include acting
as an appointed representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may
be reported to the elfutils code of conduct committee at
elfutils-cond...@sourceware.org.

The current members of the elfutils code of conduct committee are:
Mark Wielaard
Aaron Merey

All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security
of the reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in
determining the consequences for any action they deem in violation of
this Code of 

Re: [PATCH 0/2] Add initial support for Hexagon

2024-03-28 Thread Mark Wielaard
Hi Matheus,

On Thu, Mar 21, 2024 at 06:09:08PM -0300, Matheus Tavares Bernardino wrote:
> The patches were inspired by
> https://sourceware.org/cgit/elfutils/commit?id=13a4d1279c5b7847049ca3045d04f2705c45ce31
> 
> Related to:
> https://lore.kernel.org/all/6498586d7d0ed112e6c44be98d439abc549653c7.ca...@klomp.org/t/#u
> 
> Matheus Tavares Bernardino (2):
>   Add support for Hexagon
>   Hexagon: implement machine flag check

In general this looks good. It is the minimal backend support to get
eu-strip --reloc-debug-sections and opening ET_REL (kernel module)
debug files with dwfl that are automatically relocated.

The only issue is that we like to keep libelf/elf.h synced with glibc
elf/elf.h. Would it be possible/make sense to submit the elf.h changes
to libc-alpha? Otherwise we should keep the new constants in some
other file (maybe libelf/elf-knowledge.h)?

Is there a public psabi for Hexagon? Then including an URL to it would
be helpful.

If possible you might want to include some simple test file. See
tests/run-strip-reloc-ko.sh

Thanks,

Mark