This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [RFC] Collision between NT_GNU_BUILD_ATTRIBUTE_OPEN and NT_PPC_VMX
On Sat, Aug 12, 2017 at 10:52:51AM +0930, Alan Modra wrote:
> On Fri, Aug 11, 2017 at 04:03:26PM -0700, H.J. Lu wrote:
> > This is wrong. pnote->type is unique only for a given pnote->namedata.
>
> That is true. According to the gABI, the name is supposed to be the
> originator of the note, and the type is decoded depending on the name.
>
> > NT_GNU_* should be be checked for "GNU" notes.
>
> Well, yes, but NT_GNU_BUILD_ATTRIBUTE_* doesn't use "GNU". The
> proposal at https://fedoraproject.org/wiki/Toolchain/Watermark says
> they ought to start with "GA", and even that stretches the gABI
> description of notes, but the support and testcases Nick committed
> omit "GA". So we don't have anything remotely like an originator
> string. The name dives straight into data. :-(
OK, so I thought I'd have another look at this (escaping outside
work in the garden). It seems from the objcopy code that the "GA"
style is version 2 of these notes. Good!
Here is what I'm going to commit.
* readelf.c (process_note): Qualify NT_GNU_BUILD_ATTRIBUTE notes
by name data.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 2b15f0f..0fc6562 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -17477,8 +17477,11 @@ process_note (Elf_Internal_Note * pnote,
printf (" ");
- if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
- || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
+ if (((const_strneq (pnote->namedata, "GA")
+ && strchr ("*$!+", pnote->namedata[2]) != NULL)
+ || strchr ("*$!+", pnote->namedata[0]) != NULL)
+ && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
+ || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
print_gnu_build_attribute_name (pnote);
else
print_symbol (-20, name);
@@ -17496,8 +17499,11 @@ process_note (Elf_Internal_Note * pnote,
return print_stapsdt_note (pnote);
else if (const_strneq (pnote->namedata, "CORE"))
return print_core_note (pnote);
- else if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
- || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
+ else if (((const_strneq (pnote->namedata, "GA")
+ && strchr ("*$!+", pnote->namedata[2]) != NULL)
+ || strchr ("*$!+", pnote->namedata[0]) != NULL)
+ && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
+ || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
return print_gnu_build_attribute_description (pnote, file);
if (pnote->descsz)
--
Alan Modra
Australia Development Lab, IBM