diff options
Diffstat (limited to 'contrib/elftoolchain/elfcopy/elfcopy.h')
-rw-r--r-- | contrib/elftoolchain/elfcopy/elfcopy.h | 317 |
1 files changed, 0 insertions, 317 deletions
diff --git a/contrib/elftoolchain/elfcopy/elfcopy.h b/contrib/elftoolchain/elfcopy/elfcopy.h deleted file mode 100644 index b750246d850d..000000000000 --- a/contrib/elftoolchain/elfcopy/elfcopy.h +++ /dev/null @@ -1,317 +0,0 @@ -/*- - * Copyright (c) 2007-2013 Kai Wang - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Id: elfcopy.h 3173 2015-03-27 16:46:13Z emaste $ - */ - -#include <sys/queue.h> -#include <gelf.h> -#include <libelftc.h> - -#include "_elftc.h" - -/* - * User specified symbol operation (strip, keep, localize, globalize, - * weaken, rename, etc). - */ -struct symop { - const char *name; - const char *newname; - -#define SYMOP_KEEP 0x0001U -#define SYMOP_STRIP 0x0002U -#define SYMOP_GLOBALIZE 0x0004U -#define SYMOP_LOCALIZE 0x0008U -#define SYMOP_KEEPG 0x0010U -#define SYMOP_WEAKEN 0x0020U -#define SYMOP_REDEF 0x0040U - - unsigned int op; - - STAILQ_ENTRY(symop) symop_list; -}; - -/* File containing symbol list. */ -struct symfile { - dev_t dev; - ino_t ino; - size_t size; - char *data; - unsigned int op; - - STAILQ_ENTRY(symfile) symfile_list; -}; - -/* Sections to copy/remove/rename/... */ -struct sec_action { - const char *name; - const char *addopt; - const char *newname; - const char *string; - uint64_t lma; - uint64_t vma; - int64_t lma_adjust; - int64_t vma_adjust; - -#define SF_ALLOC 0x0001U -#define SF_LOAD 0x0002U -#define SF_NOLOAD 0x0004U -#define SF_READONLY 0x0008U -#define SF_DEBUG 0x0010U -#define SF_CODE 0x0020U -#define SF_DATA 0x0040U -#define SF_ROM 0x0080U -#define SF_SHARED 0X0100U -#define SF_CONTENTS 0x0200U - - int flags; - int add; - int append; - int compress; - int copy; - int print; - int remove; - int rename; - int setflags; - int setlma; - int setvma; - - STAILQ_ENTRY(sec_action) sac_list; -}; - -/* Sections to add from file. */ -struct sec_add { - char *name; - char *content; - size_t size; - - STAILQ_ENTRY(sec_add) sadd_list; -}; - -struct segment; - -/* Internal data structure for sections. */ -struct section { - struct segment *seg; /* containing segment */ - struct segment *seg_tls; /* tls segment */ - const char *name; /* section name */ - char *newname; /* new section name */ - Elf_Scn *is; /* input scn */ - Elf_Scn *os; /* output scn */ - void *buf; /* section content */ - uint8_t *pad; /* section padding */ - uint64_t off; /* section offset */ - uint64_t sz; /* section size */ - uint64_t cap; /* section capacity */ - uint64_t align; /* section alignment */ - uint64_t type; /* section type */ - uint64_t vma; /* section virtual addr */ - uint64_t lma; /* section load addr */ - uint64_t pad_sz;/* section padding size */ - int loadable; /* whether loadable */ - int pseudo; - int nocopy; - - TAILQ_ENTRY(section) sec_list; /* next section */ -}; - -/* Internal data structure for segments. */ -struct segment { - uint64_t addr; /* load addr */ - uint64_t off; /* file offset */ - uint64_t fsz; /* file size */ - uint64_t msz; /* memory size */ - uint64_t type; /* segment type */ - int remove; /* whether remove */ - int nsec; /* number of sections contained */ - struct section **v_sec; /* list of sections contained */ - - STAILQ_ENTRY(segment) seg_list; /* next segment */ -}; - -/* - * In-memory representation of ar(1) archive member(object). - */ -struct ar_obj { - char *name; /* member name */ - char *buf; /* member content */ - void *maddr; /* mmap start address */ - uid_t uid; /* user id */ - gid_t gid; /* group id */ - mode_t md; /* octal file permissions */ - size_t size; /* member size */ - time_t mtime; /* modification time */ - - STAILQ_ENTRY(ar_obj) objs; -}; - -/* - * Structure encapsulates the "global" data for "elfcopy" program. - */ -struct elfcopy { - const char *progname; /* program name */ - int iec; /* elfclass of input object */ - Elftc_Bfd_Target_Flavor itf; /* flavour of input object */ - Elftc_Bfd_Target_Flavor otf; /* flavour of output object */ - const char *otgt; /* output target name */ - int oec; /* elfclass of output object */ - unsigned char oed; /* endianess of output object */ - int oem; /* EM_XXX of output object */ - int abi; /* OSABI of output object */ - Elf *ein; /* ELF descriptor of input object */ - Elf *eout; /* ELF descriptor of output object */ - int iphnum; /* num. of input object phdr entries */ - int ophnum; /* num. of output object phdr entries */ - int nos; /* num. of output object sections */ - - enum { - STRIP_NONE = 0, - STRIP_ALL, - STRIP_DEBUG, - STRIP_DWO, - STRIP_NONDEBUG, - STRIP_NONDWO, - STRIP_UNNEEDED - } strip; - -#define EXECUTABLE 0x00000001U -#define DYNAMIC 0x00000002U -#define RELOCATABLE 0x00000004U -#define SYMTAB_EXIST 0x00000010U -#define SYMTAB_INTACT 0x00000020U -#define KEEP_GLOBAL 0x00000040U -#define DISCARD_LOCAL 0x00000080U -#define WEAKEN_ALL 0x00000100U -#define PRESERVE_DATE 0x00001000U -#define SREC_FORCE_S3 0x00002000U -#define SREC_FORCE_LEN 0x00004000U -#define SET_START 0x00008000U -#define GAP_FILL 0x00010000U -#define WILDCARD 0x00020000U -#define NO_CHANGE_WARN 0x00040000U -#define SEC_ADD 0x00080000U -#define SEC_APPEND 0x00100000U -#define SEC_COMPRESS 0x00200000U -#define SEC_PRINT 0x00400000U -#define SEC_REMOVE 0x00800000U -#define SEC_COPY 0x01000000U -#define DISCARD_LLABEL 0x02000000U -#define LOCALIZE_HIDDEN 0x04000000U - - int flags; /* elfcopy run control flags. */ - int64_t change_addr; /* Section address adjustment. */ - int64_t change_start; /* Entry point adjustment. */ - uint64_t set_start; /* Entry point value. */ - unsigned long srec_len; /* S-Record length. */ - uint64_t pad_to; /* load address padding. */ - uint8_t fill; /* gap fill value. */ - char *prefix_sec; /* section prefix. */ - char *prefix_alloc; /* alloc section prefix. */ - char *prefix_sym; /* symbol prefix. */ - char *debuglink; /* GNU debuglink file. */ - struct section *symtab; /* .symtab section. */ - struct section *strtab; /* .strtab section. */ - struct section *shstrtab; /* .shstrtab section. */ - uint64_t *secndx; /* section index map. */ - uint64_t *symndx; /* symbol index map. */ - unsigned char *v_rel; /* symbols needed by relocation. */ - unsigned char *v_secsym; /* sections with section symbol. */ - STAILQ_HEAD(, segment) v_seg; /* list of segments. */ - STAILQ_HEAD(, sec_action) v_sac;/* list of section operations. */ - STAILQ_HEAD(, sec_add) v_sadd; /* list of sections to add. */ - STAILQ_HEAD(, symop) v_symop; /* list of symbols operations. */ - STAILQ_HEAD(, symfile) v_symfile; /* list of symlist files. */ - TAILQ_HEAD(, section) v_sec; /* list of sections. */ - - /* - * Fields for the ar(1) archive. - */ - char *as; /* buffer for archive string table. */ - size_t as_sz; /* current size of as table. */ - size_t as_cap; /* capacity of as table buffer. */ - uint32_t s_cnt; /* current number of symbols. */ - uint32_t *s_so; /* symbol offset table. */ - size_t s_so_cap; /* capacity of so table buffer. */ - char *s_sn; /* symbol name table */ - size_t s_sn_cap; /* capacity of sn table buffer. */ - size_t s_sn_sz; /* current size of sn table. */ - off_t rela_off; /* offset relative to pseudo members. */ - STAILQ_HEAD(, ar_obj) v_arobj; /* archive object(member) list. */ -}; - -void add_section(struct elfcopy *_ecp, const char *_optarg); -void add_to_shstrtab(struct elfcopy *_ecp, const char *_name); -void add_to_symop_list(struct elfcopy *_ecp, const char *_name, - const char *_newname, unsigned int _op); -void add_to_symtab(struct elfcopy *_ecp, const char *_name, - uint64_t _st_value, uint64_t _st_size, uint16_t _st_shndx, - unsigned char _st_info, unsigned char _st_other, int _ndx_known); -int add_to_inseg_list(struct elfcopy *_ecp, struct section *_sec); -void adjust_addr(struct elfcopy *_ecp); -void copy_content(struct elfcopy *_ecp); -void copy_data(struct section *_s); -void copy_phdr(struct elfcopy *_ecp); -void copy_shdr(struct elfcopy *_ecp, struct section *_s, const char *_name, - int _copy, int _sec_flags); -void create_binary(int _ifd, int _ofd); -void create_elf(struct elfcopy *_ecp); -void create_elf_from_binary(struct elfcopy *_ecp, int _ifd, const char *ifn); -void create_elf_from_ihex(struct elfcopy *_ecp, int _ifd); -void create_elf_from_srec(struct elfcopy *_ecp, int _ifd); -struct section *create_external_section(struct elfcopy *_ecp, const char *_name, - char *_newname, void *_buf, uint64_t _size, uint64_t _off, uint64_t _stype, - Elf_Type _dtype, uint64_t flags, uint64_t _align, uint64_t _vma, - int _loadable); -void create_external_symtab(struct elfcopy *_ecp); -void create_ihex(int _ifd, int _ofd); -void create_scn(struct elfcopy *_ecp); -void create_srec(struct elfcopy *_ecp, int _ifd, int _ofd, const char *_ofn); -void create_symtab(struct elfcopy *_ecp); -void create_symtab_data(struct elfcopy *_ecp); -void create_tempfile(char **_fn, int *_fd); -void finalize_external_symtab(struct elfcopy *_ecp); -void free_elf(struct elfcopy *_ecp); -void free_sec_act(struct elfcopy *_ecp); -void free_sec_add(struct elfcopy *_ecp); -void free_symtab(struct elfcopy *_ecp); -void init_shstrtab(struct elfcopy *_ecp); -void insert_to_sec_list(struct elfcopy *_ecp, struct section *_sec, - int _tail); -struct section *insert_shtab(struct elfcopy *_ecp, int tail); -int is_remove_reloc_sec(struct elfcopy *_ecp, uint32_t _sh_info); -int is_remove_section(struct elfcopy *_ecp, const char *_name); -struct sec_action *lookup_sec_act(struct elfcopy *_ecp, - const char *_name, int _add); -struct symop *lookup_symop_list(struct elfcopy *_ecp, const char *_name, - unsigned int _op); -void resync_sections(struct elfcopy *_ecp); -void set_shstrtab(struct elfcopy *_ecp); -void setup_phdr(struct elfcopy *_ecp); -void update_shdr(struct elfcopy *_ecp, int _update_link); - -#ifndef LIBELF_AR -int ac_detect_ar(int _ifd); -void ac_create_ar(struct elfcopy *_ecp, int _ifd, int _ofd); -#endif /* ! LIBELF_AR */ |