Hi Aaron,
On Sun, Jun 22, 2025 at 07:02:04PM -0400, Aaron Merey wrote:
> Signed-off-by: Aaron Merey <[email protected]>
>
> ---
> v2: Clarify that the offset refers to the archive member header.
>
> > > +.SH RETURN VALUE
> > > +Return the file offset, in bytes, of the archive member referred to by
> > > +.IR elf .
> > > +If
> > > +.I elf
> > > +is NULL or is not a member of an archive,
> > > +return
> > > +.BR ELF_C_NULL .
> >
> > ehe, yes, that is true, although confusing...
> > It also isn't what other implementations seem to do, which return -1.
> > And it looks like we actually expect -1 ourselves in ar.c and ranlib.c
> > Groan :{
> > Might this really be a bug that nobody noticed before?
> > Should we fix it? Or is there a big risk we have users that rely on it
> > returning ELF_C_NULL instead of -1?
>
> IMO we should just leave it as is. elf_getaroff was added nearly 20
> years ago and I can't find any complaints about about this detail.
> But if we change this now we might get complaints.
But it doesn't really make sense. Our own code checks for -1 to detect
errors. Given it returns an offset (int64_t) it makes sense that an
error is represented as -1. It also seems to be what other
implementations do (only checked the mr511 implementation which seems
to be the only other one that implements elf_getaroff).
It also only matters for error management. Which might explain why
nobody noticed since you would normally call this just if you know you
have a valid ar member. Which seems to be what our own ar.c code does.
> doc/Makefile.am | 1 +
> doc/elf_getaroff.3 | 59 ++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 60 insertions(+)
> create mode 100644 doc/elf_getaroff.3
>
> diff --git a/doc/Makefile.am b/doc/Makefile.am
> index fbfebfe0..6451ffab 100644
> --- a/doc/Makefile.am
> +++ b/doc/Makefile.am
> @@ -55,6 +55,7 @@ notrans_dist_man3_MANS= elf32_checksum.3 \
> elf_errmsg.3 \
> elf_errno.3 \
> elf_fill.3 \
> + elf_getaroff.3 \
> elf_getbase.3 \
> elf_getdata.3 \
> elf_getscn.3 \
> diff --git a/doc/elf_getaroff.3 b/doc/elf_getaroff.3
> new file mode 100644
> index 00000000..3a393e5d
> --- /dev/null
> +++ b/doc/elf_getaroff.3
> @@ -0,0 +1,59 @@
> +.TH ELF_GETAROFF 3 2025-06-06 "Libelf" "Libelf Programmer's Manual"
> +
> +.SH NAME
> +elf_getaroff \- retrieve the offset of an archive member header
> +
> +.SH SYNOPSIS
> +.nf
> +.B #include <libelf.h>
> +
> +.BI "int64_t elf_getaroff(Elf *" elf ");"
> +.fi
> +.SH DESCRIPTION
> +Return the file offset, in bytes, of the archive member header currently
> +referred to by an ELF descriptor. This is the offset of the member header
> +in the parent archive file. This offset can be used with
> +.BR elf_rand .
> +
> +.SH PARAMETERS
> +.TP
> +.I elf
> +Elf descriptor referring to a member of an archive file header.
> +
> +.SH RETURN VALUE
> +Return the file offset, in bytes, of the archive member header referred
> +to by
> +.IR elf .
> +If
> +.I elf
> +is NULL or is not a member of an archive,
> +return
> +.BR ELF_C_NULL .
So I really think we should fix the implementation and return -1 on error.
> +.SH SEE ALSO
> +.BR elf_begin (3),
> +.BR elf_next (3),
> +.BR elf_rand (3),
> +.BR libelf (3),
> +.BR elf (5)
> +
> +.SH ATTRIBUTES
> +.TS
> +allbox;
> +lbx lb lb
> +l l l.
> +Interface Attribute Value
> +T{
> +.na
> +.nh
> +.BR elf_getaroff ()
> +T} Thread safety MT-Safe
> +.TE
> +
> +.SH REPORTING BUGS
> +Report bugs to <[email protected]> or
> https://sourceware.org/bugzilla/.
> +
> +.SH HISTORY
> +.B elf_getaroff
> +first appeared in elfutils 0.114. This elfutils libelf function may not be
> +found in other libelf implementations.
Looks good otherwise.
Thanks,
Mark