diff options
Diffstat (limited to 'include/simple-object.h')
-rw-r--r-- | include/simple-object.h | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/include/simple-object.h b/include/simple-object.h new file mode 100644 index 0000000..a72e4a1 --- /dev/null +++ b/include/simple-object.h @@ -0,0 +1,203 @@ +/* simple-object.h -- simple routines to read and write object files + Copyright 2010 Free Software Foundation, Inc. + Written by Ian Lance Taylor, Google. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef SIMPLE_OBJECT_H +#define SIMPLE_OBJECT_H + +#include <stddef.h> +#include <sys/types.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* This header file provides four types with associated functions. + They are used to read and write object files. This is a minimal + interface, intended to support the needs of gcc without bringing in + all the power and complexity of BFD. */ + +/* The type simple_object_read * is used to read an existing object + file. */ + +typedef struct simple_object_read_struct simple_object_read; + +/* Create an simple_object_read given DESCRIPTOR, an open file + descriptor, and OFFSET, an offset within the file. The offset is + for use with archives, and should be 0 for an ordinary object file. + The descriptor must remain open until done with the returned + simple_object_read. SEGMENT_NAME is used on Mach-O and is required + on that platform: it means to only look at sections within the + segment with that name. It is ignored for other object file + formats. On error, this function returns NULL, and sets *ERRMSG to + an error string and sets *ERR to an errno value or 0 if there is no + relevant errno. */ + +extern simple_object_read * +simple_object_start_read (int descriptor, off_t offset, + const char *segment_name, const char **errmsg, + int *err); + +/* Call PFN for each section in SIMPLE_OBJECT, passing it the section + name, offset within the file of the section contents, and length of + the section contents. The offset within the file is relative to + the offset passed to simple_object_start_read. The DATA argument + to simple_object_find_sections is passed on to PFN. If PFN returns + 0, the loop is stopped and simple_object_find_sections returns. If + PFN returns non-zero, the loop continues. On success this returns + NULL. On error it returns an error string, and sets *ERR to an + errno value or 0 if there is no relevant errno. */ + +extern const char * +simple_object_find_sections (simple_object_read *simple_object, + int (*pfn) (void *data, const char *, + off_t offset, off_t length), + void *data, + int *err); + +/* Look for the section NAME in SIMPLE_OBJECT. This returns + information for the first section NAME in SIMPLE_OBJECT. Note that + calling this multiple times is inefficient; use + simple_object_find_sections instead. + + If found, return 1 and set *OFFSET to the offset in the file of the + section contents and set *LENGTH to the length of the section + contents. *OFFSET will be relative to the offset passed to + simple_object_start_read. + + If the section is not found, and no error occurs, return 0 and set + *ERRMSG to NULL. + + If an error occurs, return 0, set *ERRMSG to an error message, and + set *ERR to an errno value or 0 if there is no relevant errno. */ + +extern int +simple_object_find_section (simple_object_read *simple_object, + const char *name, off_t *offset, off_t *length, + const char **errmsg, int *err); + +/* Release all resources associated with SIMPLE_OBJECT. This does not + close the file descriptor. */ + +extern void +simple_object_release_read (simple_object_read *); + +/* The type simple_object_attributes holds the attributes of an object + file that matter for creating a file or ensuring that two files are + compatible. This is a set of magic numbers. */ + +typedef struct simple_object_attributes_struct simple_object_attributes; + +/* Fetch the attributes of SIMPLE_OBJECT. This information will + persist until simple_object_attributes_release is called, even if + SIMPLE_OBJECT is closed. On error this returns NULL, sets *ERRMSG + to an error message, and sets *ERR to an errno value or 0 if there + isn't one. */ + +extern simple_object_attributes * +simple_object_fetch_attributes (simple_object_read *simple_object, + const char **errmsg, int *err); + +/* Compare ATTRS1 and ATTRS2. If they could be linked together + without error, return NULL. Otherwise, return an error message, + set *ERR to an errno value or 0 if there isn't one. */ + +extern const char * +simple_object_attributes_compare (simple_object_attributes *attrs1, + simple_object_attributes *attrs2, + int *err); + +/* Release all resources associated with ATTRS. */ + +extern void +simple_object_release_attributes (simple_object_attributes *attrs); + +/* The type simple_object_write is used to create a new object file. */ + +typedef struct simple_object_write_struct simple_object_write; + +/* Start creating a new object file which is like 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. The segment name is only used on Mach-O, + where it is required. It means that all sections are created + within that segment. It is ignored for other object file formats. + On error this function returns NULL, sets *ERRMSG to an error + message, and sets *ERR to an errno value or 0 if there isn't + one. */ + +extern simple_object_write * +simple_object_start_write (simple_object_attributes *attrs, + const char *segment_name, + const char **errmsg, int *err); + +/* The type simple_object_write_section is a handle for a section + which is being written. */ + +typedef struct simple_object_write_section_struct simple_object_write_section; + +/* Add a section to SIMPLE_OBJECT. NAME is the name of the new + section. 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. On error this + returns NULL, sets *ERRMSG to an error message, and sets *ERR to an + errno value or 0 if there isn't one. */ + +extern simple_object_write_section * +simple_object_write_create_section (simple_object_write *simple_object, + const char *name, unsigned int align, + const char **errmsg, int *err); + +/* Add data BUFFER/SIZE to SECTION in SIMPLE_OBJECT. If COPY is + non-zero, the data will be copied into memory if necessary. If + COPY is zero, BUFFER must persist until SIMPLE_OBJECT is released. + On success this returns NULL. On error this returns an error + message, and sets *ERR to an errno value or 0 if there isn't + one. */ + +extern const char * +simple_object_write_add_data (simple_object_write *simple_object, + simple_object_write_section *section, + const void *buffer, size_t size, + int copy, int *err); + +/* Write the complete object file to DESCRIPTOR, an open file + descriptor. This returns NULL on success. On error this returns + an error message, and sets *ERR to an errno value or 0 if there + isn't one. */ + +extern const char * +simple_object_write_to_file (simple_object_write *simple_object, + int descriptor, int *err); + +/* Release all resources associated with SIMPLE_OBJECT, including any + simple_object_write_section's that may have been created. */ + +extern void +simple_object_release_write (simple_object_write *); + +#ifdef __cplusplus +} +#endif + +#endif |