@c -*- mode: texinfo -*-
@deftypefn Extension {simple_object_read *} simple_object_open_read (int @var{descriptor}, off_t @var{offset}, const char *{segment_name}, const char **@var{errmsg}, int *@var{err})

Opens an object file for reading.  Creates and returns an
@code{simple_object_read} pointer which may be passed to other
functions to extract data from the object file.

@var{descriptor} holds a file descriptor which permits reading.

@var{offset} is the offset into the file; this will be @code{0} in the
normal case, but may be a different value when reading an object file
in an archive file.

@var{segment_name} is only used with the Mach-O file format used on
Darwin aka Mac OS X.  It is required on that platform, and means to
only look at sections within the segment with that name.  The
parameter is ignored on other systems.

If an error occurs, this functions returns @code{NULL} and sets
@code{*@var{errmsg}} to an error string and sets @code{*@var{err}} to
an errno value or @code{0} if there is no relevant errno.

@end deftypefn

@deftypefn Extension {const char *} simple_object_find_sections (simple_object_read *@var{simple_object}, int (*@var{pfn}) (void *@var{data}, const char *@var{name}, off_t @var{offset}, off_t @var{length}), void *@var{data}, int *@var{err})

This function calls @var{pfn} for each section in @var{simple_object}.
It calls @var{pfn} with the section name, the offset within the file
of the section contents, and the length of the section contents.  The
offset within the file is relative to the offset passed to
@code{simple_object_open_read}.  The @var{data} argument to this
function is passed along to @var{pfn}.

If @var{pfn} returns @code{0}, the loop over the sections stops and
@code{simple_object_find_sections} returns.  If @var{pfn} returns some
other value, the loop continues.

On success @code{simple_object_find_sections} returns.  On error it
returns an error string, and sets @code{*@var{err}} to an errno value
or @code{0} if there is no relevant errno.

@end deftypefn

@deftypefn Extension {int} simple_object_find_section (simple_object_read *@var{simple_object} off_t *@var{offset}, off_t *@var{length}, const char **@var{errmsg}, int *@var{err})           

Look for the section @var{name} in @var{simple_object}.  This returns
information for the first section with that name.

If found, return 1 and set @code{*@var{offset}} to the offset in the
file of the section contents and set @code{*@var{length}} to the
length of the section contents.  The value in @code{*@var{offset}}
will be relative to the offset passed to
@code{simple_object_open_read}.

If the section is not found, and no error occurs,
@code{simple_object_find_section} returns @code{0} and set
@code{*@var{errmsg}} to @code{NULL}.

If an error occurs, @code{simple_object_find_section} returns
@code{0}, sets @code{*@var{errmsg}} to an error message, and sets
@code{*@var{err}} to an errno value or @code{0} if there is no
relevant errno.

@end deftypefn

@deftypefn Extension {void} simple_object_release_read (simple_object_read *@var{simple_object})

Release all resources associated with @var{simple_object}.  This does
not close the file descriptor.

@end deftypefn

@deftypefn Extension {simple_object_attributes *} simple_object_fetch_attributes (simple_object_read *@var{simple_object}, const char **@var{errmsg}, int *@var{err})

Fetch the attributes of @var{simple_object}.  The attributes are
internal information such as the format of the object file, or the
architecture it was compiled for.  This information will persist until
@code{simple_object_attributes_release} is called, even if
@var{simple_object} itself is released.

On error this returns @code{NULL}, sets @code{*@var{errmsg}} to an
error message, and sets @code{*@var{err}} to an errno value or
@code{0} if there is no relevant errno.

@end deftypefn

@deftypefn Extension {const char *} simple_object_attributes_compare (simple_object_attributes *@var{attrs1}, simple_object_attributes *@var{attrs2}, int *@var{err})

Compare @var{attrs1} and @var{attrs2}.  If they could be linked
together without error, return @code{NULL}.  Otherwise, return an
error message and set @code{*@var{err}} to an errno value or @code{0}
if there is no relevant errno.

@end deftypefn

@deftypefn Extension {void} simple_object_release_attributes (simple_object_attributes *@var{attrs})

Release all resources associated with @var{attrs}.

@end deftypefn

@deftypefn Extension {simple_object_write *} simple_object_start_write (simple_object_attributes @var{attrs}, const char *@var{segment_name}, const char **@var{errmsg}, int *@var{err})

Start creating a new object file using the object file format
described in @var{attrs}.  You must fetch attribute information from
an existing object file before you can create a new one.  There is
currently no support for creating an object file de novo.

@var{segment_name} is only used with Mach-O as found on Darwin aka Mac
OS X.  The parameter is required on that target.  It means that all
sections are created within the named segment.  It is ignored for
other object file formats.

On error @code{simple_object_start_write} returns @code{NULL}, sets
@code{*@var{ERRMSG}} to an error message, and sets @code{*@var{err}}
to an errno value or @code{0} if there is no relevant errno.

@end deftypefn

@deftypefn Extension {simple_object_write_section *} simple_object_write_create_section (simple_object_write *@var{simple_object}, const char *@var{name}, unsigned int @var{align}, const char **@var{errmsg}, int *@var{err})

Add a section to @var{simple_object}.  @var{name} is the name of the
new section.  @var{align} is the required alignment expressed as the
number of required low-order 0 bits (e.g., 2 for alignment to a 32-bit
boundary).

The section is created as containing data, readable, not writable, not
executable, not loaded at runtime.  The section is not written to the
file until @code{simple_object_write_to_file} is called.

On error this returns @code{NULL}, sets @code{*@var{errmsg}} to an
error message, and sets @code{*@var{err}} to an errno value or
@code{0} if there is no relevant errno.

@end deftypefn

@deftypefn Extension {const char *} simple_object_write_add_data (simple_object_write *@var{simple_object}, simple_object_write_section *@var{section}, const void *@var{buffer}, size_t @var{size}, int @var{copy}, int *@var{err})

Add data @var{buffer}/@var{size} to @var{section} in
@var{simple_object}.  If @var{copy} is non-zero, the data will be
copied into memory if necessary.  If @var{copy} is zero, @var{buffer}
must persist until @code{simple_object_write_to_file} is called.  is
released.

On success this returns @code{NULL}.  On error this returns an error
message, and sets @code{*@var{err}} to an errno value or 0 if there is
no relevant erro.

@end deftypefn

@deftypefn Extension {const char *} simple_object_write_to_file (simple_object_write *@var{simple_object}, int @var{descriptor}, int *@var{err})

Write the complete object file to @var{descriptor}, an open file
descriptor.  This writes out all the data accumulated by calls to
@code{simple_object_write_create_section} and
@var{simple_object_write_add_data}.

This returns @code{NULL} on success.  On error this returns an error
message and sets @code{*@var{err}} to an errno value or @code{0} if
there is no relevant errno.

@end deftypefn

@deftypefn Extension {void} simple_object_release_write (simple_object_write *@var{simple_object})

Release all resources associated with @var{simple_object}.

@end deftypefn
