Subversion Repositories Kolibri OS

Rev

Rev 5191 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* simple-object.h -- simple routines to read and write object files
  2.    Copyright (C) 2010-2015 Free Software Foundation, Inc.
  3.    Written by Ian Lance Taylor, Google.
  4.  
  5. This program is free software; you can redistribute it and/or modify it
  6. under the terms of the GNU General Public License as published by the
  7. Free Software Foundation; either version 2, or (at your option) any
  8. later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, 51 Franklin Street - Fifth Floor,
  18. Boston, MA 02110-1301, USA.  */
  19.  
  20. #ifndef SIMPLE_OBJECT_H
  21. #define SIMPLE_OBJECT_H
  22.  
  23. #include <stddef.h>
  24. #include <sys/types.h>
  25.  
  26. #ifdef HAVE_UNISTD_H
  27. #include <unistd.h>
  28. #endif
  29.  
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33.  
  34. /* This header file provides four types with associated functions.
  35.    They are used to read and write object files.  This is a minimal
  36.    interface, intended to support the needs of gcc without bringing in
  37.    all the power and complexity of BFD.  */
  38.  
  39. /* The type simple_object_read * is used to read an existing object
  40.    file.  */
  41.  
  42. typedef struct simple_object_read_struct simple_object_read;
  43.  
  44. /* Create an simple_object_read given DESCRIPTOR, an open file
  45.    descriptor, and OFFSET, an offset within the file.  The offset is
  46.    for use with archives, and should be 0 for an ordinary object file.
  47.    The descriptor must remain open until done with the returned
  48.    simple_object_read.  SEGMENT_NAME is used on Mach-O and is required
  49.    on that platform: it means to only look at sections within the
  50.    segment with that name.  It is ignored for other object file
  51.    formats.  On error, this function returns NULL, and sets *ERRMSG to
  52.    an error string and sets *ERR to an errno value or 0 if there is no
  53.    relevant errno.  */
  54.  
  55. extern simple_object_read *
  56. simple_object_start_read (int descriptor, off_t offset,
  57.                           const char *segment_name, const char **errmsg,
  58.                           int *err);
  59.  
  60. /* Call PFN for each section in SIMPLE_OBJECT, passing it the section
  61.    name, offset within the file of the section contents, and length of
  62.    the section contents.  The offset within the file is relative to
  63.    the offset passed to simple_object_start_read.  The DATA argument
  64.    to simple_object_find_sections is passed on to PFN.  If PFN returns
  65.    0, the loop is stopped and simple_object_find_sections returns.  If
  66.    PFN returns non-zero, the loop continues.  On success this returns
  67.    NULL.  On error it returns an error string, and sets *ERR to an
  68.    errno value or 0 if there is no relevant errno.  */
  69.  
  70. extern const char *
  71. simple_object_find_sections (simple_object_read *simple_object,
  72.                              int (*pfn) (void *data, const char *,
  73.                                          off_t offset, off_t length),
  74.                              void *data,
  75.                              int *err);
  76.  
  77. /* Look for the section NAME in SIMPLE_OBJECT.  This returns
  78.    information for the first section NAME in SIMPLE_OBJECT.  Note that
  79.    calling this multiple times is inefficient; use
  80.    simple_object_find_sections instead.
  81.  
  82.    If found, return 1 and set *OFFSET to the offset in the file of the
  83.    section contents and set *LENGTH to the length of the section
  84.    contents.  *OFFSET will be relative to the offset passed to
  85.    simple_object_start_read.
  86.  
  87.    If the section is not found, and no error occurs, return 0 and set
  88.    *ERRMSG to NULL.
  89.  
  90.    If an error occurs, return 0, set *ERRMSG to an error message, and
  91.    set *ERR to an errno value or 0 if there is no relevant errno.  */
  92.  
  93. extern int
  94. simple_object_find_section (simple_object_read *simple_object,
  95.                             const char *name, off_t *offset, off_t *length,
  96.                             const char **errmsg, int *err);
  97.  
  98. /* Release all resources associated with SIMPLE_OBJECT.  This does not
  99.    close the file descriptor.  */
  100.  
  101. extern void
  102. simple_object_release_read (simple_object_read *);
  103.  
  104. /* The type simple_object_attributes holds the attributes of an object
  105.    file that matter for creating a file or ensuring that two files are
  106.    compatible.  This is a set of magic numbers.  */
  107.  
  108. typedef struct simple_object_attributes_struct simple_object_attributes;
  109.  
  110. /* Fetch the attributes of SIMPLE_OBJECT.  This information will
  111.    persist until simple_object_attributes_release is called, even if
  112.    SIMPLE_OBJECT is closed.  On error this returns NULL, sets *ERRMSG
  113.    to an error message, and sets *ERR to an errno value or 0 if there
  114.    isn't one.  */
  115.  
  116. extern simple_object_attributes *
  117. simple_object_fetch_attributes (simple_object_read *simple_object,
  118.                                 const char **errmsg, int *err);
  119.  
  120. /* Merge the FROM attributes into TO.  If two objects with these
  121.    attributes could be linked together without error, returns NULL.
  122.    Otherwise, returns an error message, and sets *ERR to an errno
  123.    value or 0 if there isn't one.  */
  124.  
  125. extern const char *
  126. simple_object_attributes_merge (simple_object_attributes *to,
  127.                                 simple_object_attributes *from,
  128.                                 int *err);
  129.  
  130. /* Release all resources associated with ATTRS.  */
  131.  
  132. extern void
  133. simple_object_release_attributes (simple_object_attributes *attrs);
  134.  
  135. /* The type simple_object_write is used to create a new object file.  */
  136.  
  137. typedef struct simple_object_write_struct simple_object_write;
  138.  
  139. /* Start creating a new object file which is like ATTRS.  You must
  140.    fetch attribute information from an existing object file before you
  141.    can create a new one.  There is currently no support for creating
  142.    an object file de novo.  The segment name is only used on Mach-O,
  143.    where it is required.  It means that all sections are created
  144.    within that segment.  It is ignored for other object file formats.
  145.    On error this function returns NULL, sets *ERRMSG to an error
  146.    message, and sets *ERR to an errno value or 0 if there isn't
  147.    one.  */
  148.  
  149. extern simple_object_write *
  150. simple_object_start_write (simple_object_attributes *attrs,
  151.                            const char *segment_name,
  152.                            const char **errmsg, int *err);
  153.  
  154. /* The type simple_object_write_section is a handle for a section
  155.    which is being written.  */
  156.  
  157. typedef struct simple_object_write_section_struct simple_object_write_section;
  158.  
  159. /* Add a section to SIMPLE_OBJECT.  NAME is the name of the new
  160.    section.  ALIGN is the required alignment expressed as the number
  161.    of required low-order 0 bits (e.g., 2 for alignment to a 32-bit
  162.    boundary).  The section is created as containing data, readable,
  163.    not writable, not executable, not loaded at runtime.  On error this
  164.    returns NULL, sets *ERRMSG to an error message, and sets *ERR to an
  165.    errno value or 0 if there isn't one.  */
  166.  
  167. extern simple_object_write_section *
  168. simple_object_write_create_section (simple_object_write *simple_object,
  169.                                     const char *name, unsigned int align,
  170.                                     const char **errmsg, int *err);
  171.  
  172. /* Add data BUFFER/SIZE to SECTION in SIMPLE_OBJECT.  If COPY is
  173.    non-zero, the data will be copied into memory if necessary.  If
  174.    COPY is zero, BUFFER must persist until SIMPLE_OBJECT is released.
  175.    On success this returns NULL.  On error this returns an error
  176.    message, and sets *ERR to an errno value or 0 if there isn't
  177.    one.  */
  178.  
  179. extern const char *
  180. simple_object_write_add_data (simple_object_write *simple_object,
  181.                               simple_object_write_section *section,
  182.                               const void *buffer, size_t size,
  183.                               int copy, int *err);
  184.  
  185. /* Write the complete object file to DESCRIPTOR, an open file
  186.    descriptor.  This returns NULL on success.  On error this returns
  187.    an error message, and sets *ERR to an errno value or 0 if there
  188.    isn't one.  */
  189.  
  190. extern const char *
  191. simple_object_write_to_file (simple_object_write *simple_object,
  192.                              int descriptor, int *err);
  193.  
  194. /* Release all resources associated with SIMPLE_OBJECT, including any
  195.    simple_object_write_section's that may have been created.  */
  196.  
  197. extern void
  198. simple_object_release_write (simple_object_write *);
  199.  
  200. #ifdef __cplusplus
  201. }
  202. #endif
  203.  
  204. #endif
  205.