Hi Aaron,
On Wed, 2025-12-31 at 21:50 -0500, Aaron Merey wrote:
> Signed-off-by: Aaron Merey <[email protected]>
> ---
> doc/Makefile.am | 1 +
> doc/gelf_getnote.3 | 122 +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 123 insertions(+)
> create mode 100644 doc/gelf_getnote.3
>
> diff --git a/doc/Makefile.am b/doc/Makefile.am
> index fc29c2ff..4292dcba 100644
> --- a/doc/Makefile.am
> +++ b/doc/Makefile.am
> @@ -98,6 +98,7 @@ notrans_dist_man3_MANS= elf32_checksum.3 \
> gelf_getehdr.3 \
> gelf_getlib.3 \
> gelf_getmove.3 \
> + gelf_getnote.3 \
> gelf_getphdr.3 \
> gelf_getrel.3 \
> gelf_getrela.3 \
OK.
> diff --git a/doc/gelf_getnote.3 b/doc/gelf_getnote.3
> new file mode 100644
> index 00000000..6fc4297d
> --- /dev/null
> +++ b/doc/gelf_getnote.3
> @@ -0,0 +1,122 @@
> +.TH GELF_GETNOTE 3 2025-12-31 "Libelf" "Libelf Programmer's Manual"
> +
> +.SH NAME
> +gelf_getnote \- Get class\-independent note information at the supplied
> offset
> +
> +.SH SYNOPSIS
> +.nf
> +.B #include <gelf.h>
> +
> +.BI "size_t gelf_getnote (Elf_Data *" data ", size_t " offset ", GElf_Nhdr
> *" result ", size_t *" name_offset ", size_t *" desc_offset ");"
OK.
> +.SH DESCRIPTION
> +Retrieve the ELF note header from
> +.I data
> +at offset
> +.I offset
> +and store it in a class\-independent representation pointed to by
> +.IR result .
> +The note name and note descriptor offsets relative to the start of
> +.I data
> +are stored in
> +.I *name_offset
> +and
> +.IR *desc_offset ,
> +respectively.
The example is useful for describing the rest, but it wouldn't be wrong
to say something about n_namesz, n_namesz, n_type and the return value.
Also maybe note that gelf_getnote deals with the alignment and padding
of the datastructure.
> +.SH PARAMETERS
> +.TP
> +.I data
> +Pointer to an
> +.B Elf_Data
> +associated with a
> +.B SHT_NOTE
> +section or a
> +.B PT_NOTE
> +segment.
d_type should be ELF_T_NHDR or ELF_T_NHDR8
> +.TP
> +.I offset
> +Offset of a note header within
> +.IR data .
> +
> +.TP
> +.I result
> +Pointer to a caller\-provided
> +.B GElf_Nhdr
> +structure for storing the requested note header.
> +.I result
> +must not be NULL.
> +
> +.TP
> +.I name_offset
> +Pointer to a caller\-provided
> +.B size_t
> +for storing the name offset of the requested note.
> +.I name_offset
> +must not be NULL.
offset relative to start of d_buf (not the provided offset)
> +.TP
> +.I desc_offset
> +Pointer to a caller\-provided
> +.B size_t
> +for storing the descriptor offset of the requested note.
> +.I desc_offset
> +must not be NULL.
Likewise.
> +.SH RETURN VALUE
> +On success, this function updates
> +.IR *result ,
> +.IR *name_offset ,
> +and
> +.I *desc_offset
> +and returns the offset of the next note. If there are no notes remaining
> +then the return value will be greater than or equal to the
> +.B d_size
> +of
> +.IR data .
> +On failure, this function returns zero and sets elf_errno. If
> +.I data
> +is NULL then zero is returned without setting elf_errno.
OK.
> +.SH EXAMPLE
> +.nf
> + size_t offset = 0;
> + GElf_Nhdr nhdr;
> + size_t name_offset;
> + size_t desc_offset;
> + while (offset < data->d_size
> + && (offset = gelf_getnote (data, offset,
> + &nhdr, &name_offset, &desc_offset)) > 0)
> + {
> + const char *name = nhdr.n_namesz == 0 ? "" : data->d_buf + name_offset;
> + const char *desc = nhdr.n_descsz == 0 ? "" : data->d_buf + desc_offset;
> +
> + /* Process note here. */
> + [...]
/* Note that both name and desc aren't guaranteed to be zero
terminated strings, so you have to double check n_namesz
and n_descsz while processing. */
[...]
> + }
> +.fi
> +
> +.SH SEE ALSO
> +.BR libelf (3),
> +.BR elf (5)
OK.
> +.SH ATTRIBUTES
> +.TS
> +allbox;
> +lbx lb lb
> +l l l.
> +Interface Attribute Value
> +T{
> +.na
> +.nh
> +.BR gelf_getnote ()
> +T} Thread safety MT-Safe
> +.TE
The implementation seems to take the Elf lock on the elf of the section
where the Elf_Data came from. But is this needed? It only seems to use
the provided data size/buffer (and doesn't modify it). So I think we
can just remove the lock while still keeping it MT-Safe.
> +.SH REPORTING BUGS
> +Report bugs to <[email protected]> or
> https://sourceware.org/bugzilla/.
> +
> +.SH HISTORY
> +.B gelf_getnote
> +first appeared in elfutils 0.130.
This is an elfutils only gelf function not usually found in other
libelf library implementations.
Thanks,
Mark