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

Reply via email to