125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Copyright (C) 2001, 2002, 2003, 2005, 2006, 2008, 2009 Red Hat, Inc. 203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes This file is part of elfutils. 325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Written by Ulrich Drepper <drepper@redhat.com>, 2001. 425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes This file is free software; you can redistribute it and/or modify 603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes it under the terms of the GNU General Public License as published by 703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes the Free Software Foundation; either version 3 of the License, or 803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes (at your option) any later version. 925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes elfutils is distributed in the hope that it will be useful, but 1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng WITHOUT ANY WARRANTY; without even the implied warranty of 1203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes GNU General Public License for more details. 1403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes 1503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes You should have received a copy of the GNU General Public License 1603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes along with this program. If not, see <http://www.gnu.org/licenses/>. */ 1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef LD_H 1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define LD_H 1 2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <dlfcn.h> 2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <obstack.h> 2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdbool.h> 2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdio.h> 2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "xelf.h" 2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Recommended size of the buffer passed to ld_strerror. */ 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define ERRBUFSIZE (512) 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Character used to introduce version name after symbol. */ 3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define VER_CHR '@' 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Methods for handling archives. */ 3625b3c049e70834cf33790a28643ab058b507b35cBen Chengenum extract_rule 3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng defaultextract, /* Weak references don't cause archive member to 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng be used. */ 4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng weakextract, /* Weak references cause archive member to be 4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng extracted. */ 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng allextract /* Extract all archive members regardless of 4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng references (aka whole-archive). */ 4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng }; 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Type of output file. */ 4825b3c049e70834cf33790a28643ab058b507b35cBen Chengenum file_type 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng no_file_type = 0, /* None selected so far. */ 5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng executable_file_type, /* Executable. */ 5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng dso_file_type, /* DSO. */ 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng dso_needed_file_type, /* DSO introduced by DT_NEEDED. */ 5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng relocatable_file_type, /* Relocatable object file. */ 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng archive_file_type /* Archive (input only). */ 5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng }; 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5925b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct usedfiles 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The next file given at the command line. */ 6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *next; 6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Nonzero if this file is the beginning of a group. */ 6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool group_start; 6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Nonzero if this file is the end of a group. */ 6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool group_end; 6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to the beginning of the group. It is necessary to 6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng explain why we cannot simply use the 'next' pointer and have a 6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng circular single-linked list like in many cases. The problem is 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng that the last archive of the group, if it is the last file of the 7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng group, contains the only existing pointer to the next file we 7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng have to look at. All files are initially connected via the 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 'next' pointer in a single-linked list. Therefore we cannot 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng overwrite this value. It instead will be used once the group is 7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng handled and we go on processing the rest of the files. */ 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *group_backref; 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name/path of the file. */ 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *fname; 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Resolved file name. */ 8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *rfname; 8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name used as reference in DT_NEEDED entries. This is normally 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng the SONAME. If it is missing it's normally the fname above. */ 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *soname; 8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Handle for the SONAME in the string table. */ 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Ebl_Strent *sonameent; 8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Help to identify duplicates. */ 8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng dev_t dev; 9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng ino_t ino; 9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum 9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng not_opened, 9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng opened, 9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng in_archive, 9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng closed 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } status; 9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* How to extract elements from archives. */ 10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum extract_rule extract_rule; 10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Lazy-loading rule. */ 10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool lazyload; 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If this is a DSO the flag indicates whether the file is directly 10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng used in a reference. */ 10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool used; 10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True when file should be added to DT_NEEDED list only when 11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng directly referenced. */ 11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool as_needed; 11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If nonzero this is the archive sequence number which can be used to 11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng determine whether back refernces from -( -) or GROUP statements 11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng have to be followed. */ 11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng int archive_seq; 11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to the record for the archive containing this file. */ 12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *archive_file; 12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Type of file. We have to distinguish these types since they 12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng are searched for differently. */ 12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum file_type file_type; 12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* This is the ELF library handle for this file. */ 12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf *elf; 12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The ELF header. */ 12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#if NATIVE_ELF != 0 13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Ehdr *ehdr; 13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define FILEINFO_EHDR(fi) (*(fi)) 13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else 13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Ehdr ehdr; 13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define FILEINFO_EHDR(fi) (fi) 13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the section header string table section. We use a 13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng separate field and not the e_shstrndx field in the ELF header 13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng since in case of a file with more than 64000 sections the index 14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng might be stored in the section header of section zero. The 14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng elf_getshdrstrndx() function can find the value but it is too 14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng costly to repeat this call over and over. */ 14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t shstrndx; 14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Info about the sections of the file. */ 14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo 14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Handle for the section. Note that we can store a section 14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng handle here because the file is not changing. This together 15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng with the knowledge about the libelf library is enough for us to 15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng assume the section reference remains valid at all times. */ 15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Scn *scn; 15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Section header. */ 15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#if NATIVE_ELF != 0 15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Shdr *shdr; 15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define SCNINFO_SHDR(si) (*(si)) 15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else 15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Shdr shdr; 15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define SCNINFO_SHDR(si) (si) 16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Offset of this files section in the combined section. */ 16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Off offset; 16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the section in the output file. */ 16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word outscnndx; 16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the output section in the 'allsection' array. */ 16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word allsectionsidx; 16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if the section is used. */ 16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool used; 16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if section is an unused COMDAT section. */ 17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool unused_comdat; 17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if this is a COMDAT group section. */ 17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool comdat_group; 17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Section group number. This is the index of the SHT_GROUP section. */ 17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word grpid; 17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer back to the containing file information structure. */ 17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *fileinfo; 17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of symbols in this section (set only for merge-able sections 17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng and group sections). */ 17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *symbols; 18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Size of relocations in this section. Only used for relocation 18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng sections. */ 18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t relsize; 18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to next section which is put in the given output 18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng section. */ 18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo *next; 18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng } *scninfo; 18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of section group sections. */ 18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo *groups; 19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The symbol table section. 19225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng XXX Maybe support for more than one symbol table is needed. */ 19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *symtabdata; 19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Extra section index table section. */ 19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *xndxdata; 19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Dynamic symbol table section. */ 19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *dynsymtabdata; 19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The version number section. */ 20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *versymdata; 20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The defined versions. */ 20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *verdefdata; 20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of versions defined. */ 20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nverdef; 20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if the version with the given index number is used in the 20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng output. */ 20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Versym *verdefused; 20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* How many versions are used. */ 20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nverdefused; 21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Handle for name of the version. */ 21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Ebl_Strent **verdefent; 21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The needed versions. */ 21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Data *verneeddata; 21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* String table section associated with the symbol table. */ 21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word symstridx; 21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* String table section associated with the dynamic symbol table. */ 21725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dynsymstridx; 21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of entries in the symbol table. */ 21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nsymtab; 22025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nlocalsymbols; 22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t ndynsymtab; 22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Dynamic section. */ 22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf_Scn *dynscn; 22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Indirection table for the symbols defined here. */ 22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word *symindirect; 22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word *dynsymindirect; 22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* For undefined or common symbols we need a reference to the symbol 22925b3c049e70834cf33790a28643ab058b507b35cBen Cheng record. */ 23025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol **symref; 23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol **dynsymref; 23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* This is the file descriptor. The value is -1 if the descriptor 23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng was already closed. This can happen if we needed file descriptors 23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng to open new files. */ 23625b3c049e70834cf33790a28643ab058b507b35cBen Cheng int fd; 23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* This flag is true if the descriptor was passed to the generic 23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng functions from somewhere else. This is an implementation detail; 23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng no machine-specific code must use this flag. */ 24025b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool fd_passed; 24125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if any of the sections is merge-able. */ 24325b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool has_merge_sections; 24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Functions to test for the various types of files we handle. */ 24825b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic inline int 24925b3c049e70834cf33790a28643ab058b507b35cBen Chengld_file_rel_p (struct usedfiles *file) 25025b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng return (elf_kind (file->elf) == ELF_K_ELF 25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng && FILEINFO_EHDR (file->ehdr).e_type == ET_REL); 25325b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 25525b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic inline int 25625b3c049e70834cf33790a28643ab058b507b35cBen Chengld_file_dso_p (struct usedfiles *file) 25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng return (elf_kind (file->elf) == ELF_K_ELF 25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng && FILEINFO_EHDR (file->ehdr).e_type == ET_DYN); 26025b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 26225b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic inline int 26325b3c049e70834cf33790a28643ab058b507b35cBen Chengld_file_ar_p (struct usedfiles *file) 26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 26525b3c049e70834cf33790a28643ab058b507b35cBen Cheng return elf_kind (file->elf) == ELF_K_AR; 26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 26725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 26825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 26925b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct pathelement 27025b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 27125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The next path to search. */ 27225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *next; 27325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The path name. */ 27425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *pname; 27525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Larger than zero if the directory exists, smaller than zero if not, 27625b3c049e70834cf33790a28643ab058b507b35cBen Cheng zero if it is not yet known. */ 27725b3c049e70834cf33790a28643ab058b507b35cBen Cheng int exist; 27825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 27925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Forward declaration. */ 28225b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct ld_state; 28325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 28525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Callback functions. */ 28625b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct callbacks 28725b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 28825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Library names passed to the linker as -lXXX represent files named 28925b3c049e70834cf33790a28643ab058b507b35cBen Cheng libXXX.YY. The YY part can have different forms, depending on the 29025b3c049e70834cf33790a28643ab058b507b35cBen Cheng architecture. The generic set is .so and .a (in this order). */ 29125b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char **(*lib_extensions) (struct ld_state *) 29225b3c049e70834cf33790a28643ab058b507b35cBen Cheng __attribute__ ((__const__)); 29325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define LIB_EXTENSION(state) \ 29425b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.lib_extensions, (state)) 29525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 29625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Process the given file. If the file is not yet open, open it. 29725b3c049e70834cf33790a28643ab058b507b35cBen Cheng The first parameter is a file descriptor for the file which can 29825b3c049e70834cf33790a28643ab058b507b35cBen Cheng be -1 to indicate the file has not yet been found. The second 29925b3c049e70834cf33790a28643ab058b507b35cBen Cheng parameter describes the file to be opened, the last one is the 30025b3c049e70834cf33790a28643ab058b507b35cBen Cheng state of the linker which among other information contain the 30125b3c049e70834cf33790a28643ab058b507b35cBen Cheng paths we look at.*/ 30225b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*file_process) (int fd, struct usedfiles *, struct ld_state *, 30325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles **); 30425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FILE_PROCESS(fd, file, state, nextp) \ 30525b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.file_process, (fd, file, state, nextp)) 30625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 30725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Close the given file. */ 30825b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*file_close) (struct usedfiles *, struct ld_state *); 30925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FILE_CLOSE(file, state) \ 31025b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.file_close, (file, state)) 31125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 31225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the output sections now. This requires knowledge about 31325b3c049e70834cf33790a28643ab058b507b35cBen Cheng all the sections we will need. It may be necessary to sort the 31425b3c049e70834cf33790a28643ab058b507b35cBen Cheng sections in the order they are supposed to appear in the 31525b3c049e70834cf33790a28643ab058b507b35cBen Cheng executable. The sorting use many different kinds of information 31625b3c049e70834cf33790a28643ab058b507b35cBen Cheng to optimize the resulting binary. Important is to respect 31725b3c049e70834cf33790a28643ab058b507b35cBen Cheng segment boundaries and the needed alignment. The mode of the 31825b3c049e70834cf33790a28643ab058b507b35cBen Cheng segments will be determined afterwards automatically by the 31925b3c049e70834cf33790a28643ab058b507b35cBen Cheng output routines. */ 32025b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*create_sections) (struct ld_state *); 32125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CREATE_SECTIONS(state) \ 32225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.create_sections, (state)) 32325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 32425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Determine whether we have any non-weak unresolved references left. */ 32525b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*flag_unresolved) (struct ld_state *); 32625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FLAG_UNRESOLVED(state) \ 32725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.flag_unresolved, (state)) 32825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 32925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the sections which are generated by the linker and are not 33025b3c049e70834cf33790a28643ab058b507b35cBen Cheng present in the input file. */ 33125b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*generate_sections) (struct ld_state *); 33225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define GENERATE_SECTIONS(state) \ 33325b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.generate_sections, (state)) 33425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 33525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Open the output file. The file name is given or "a.out". We 33625b3c049e70834cf33790a28643ab058b507b35cBen Cheng create as much of the ELF structure as possible. */ 33725b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*open_outfile) (struct ld_state *, int, int, int); 33825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define OPEN_OUTFILE(state, machine, class, data) \ 33925b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.open_outfile, (state, machine, class, data)) 34025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 34125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the data for the output file. */ 34225b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*create_outfile) (struct ld_state *); 34325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CREATE_OUTFILE(state) \ 34425b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.create_outfile, (state)) 34525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 34625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Process a relocation section. */ 34725b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*relocate_section) (struct ld_state *, Elf_Scn *, struct scninfo *, 34825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const Elf32_Word *); 34925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define RELOCATE_SECTION(state, outscn, first, dblindirect) \ 35025b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.relocate_section, (state, outscn, first, \ 35125b3c049e70834cf33790a28643ab058b507b35cBen Cheng dblindirect)) 35225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 35325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Allocate a data buffer for the relocations of the given output 35425b3c049e70834cf33790a28643ab058b507b35cBen Cheng section. */ 35525b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*count_relocations) (struct ld_state *, struct scninfo *); 35625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define COUNT_RELOCATIONS(state, scninfo) \ 35725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.count_relocations, (state, scninfo)) 35825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 35925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create relocations for executable or DSO. */ 36025b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*create_relocations) (struct ld_state *, const Elf32_Word *); 36125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CREATE_RELOCATIONS(state, dlbindirect) \ 36225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.create_relocations, (state, dblindirect)) 36325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 36425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Finalize the output file. */ 36525b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*finalize) (struct ld_state *); 36625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FINALIZE(state) \ 36725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.finalize, (state)) 36825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 36925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Check whether special section number is known. */ 37025b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool (*special_section_number_p) (struct ld_state *, size_t); 37125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SPECIAL_SECTION_NUMBER_P(state, number) \ 37225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.special_section_number_p, (state, number)) 37325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 37425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Check whether section type is known. */ 37525b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool (*section_type_p) (struct ld_state *, XElf_Word); 37625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SECTION_TYPE_P(state, type) \ 37725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.section_type_p, (state, type)) 37825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 37925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Return section flags for .dynamic section. */ 38025b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Xword (*dynamic_section_flags) (struct ld_state *); 38125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define DYNAMIC_SECTION_FLAGS(state) \ 38225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.dynamic_section_flags, (state)) 38325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 38425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the data structures for the .plt section and initialize it. */ 38525b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*initialize_plt) (struct ld_state *, Elf_Scn *scn); 38625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define INITIALIZE_PLT(state, scn) \ 38725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.initialize_plt, (state, scn)) 38825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 38925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the data structures for the .rel.plt section and initialize it. */ 39025b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*initialize_pltrel) (struct ld_state *, Elf_Scn *scn); 39125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define INITIALIZE_PLTREL(state, scn) \ 39225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.initialize_pltrel, (state, scn)) 39325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 39425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Finalize the .plt section the what belongs to them. */ 39525b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*finalize_plt) (struct ld_state *, size_t, size_t, struct symbol **); 39625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define FINALIZE_PLT(state, nsym, nsym_dyn, ndxtosym) \ 39725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.finalize_plt, (state, nsym, nsym_dyn, \ 39825b3c049e70834cf33790a28643ab058b507b35cBen Cheng ndxtosym)) 39925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the data structures for the .got section and initialize it. */ 40125b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*initialize_got) (struct ld_state *, Elf_Scn *scn); 40225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define INITIALIZE_GOT(state, scn) \ 40325b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.initialize_got, (state, scn)) 40425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 40525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Create the data structures for the .got.plt section and initialize it. */ 40625b3c049e70834cf33790a28643ab058b507b35cBen Cheng void (*initialize_gotplt) (struct ld_state *, Elf_Scn *scn); 40725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define INITIALIZE_GOTPLT(state, scn) \ 40825b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.initialize_gotplt, (state, scn)) 40925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 41025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Return the tag corresponding to the native relocation type for 41125b3c049e70834cf33790a28643ab058b507b35cBen Cheng the platform. */ 41225b3c049e70834cf33790a28643ab058b507b35cBen Cheng int (*rel_type) (struct ld_state *); 41325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define REL_TYPE(state) \ 41425b3c049e70834cf33790a28643ab058b507b35cBen Cheng DL_CALL_FCT ((state)->callbacks.rel_type, (state)) 41525b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 41625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 41725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 41825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Structure for symbol representation. This data structure is used a 41925b3c049e70834cf33790a28643ab058b507b35cBen Cheng lot, so size is important. */ 42025b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct symbol 42125b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 42225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Symbol name. */ 42325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name; 42425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Size of the object. */ 42525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Xword size; 42625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the symbol in the symbol table of the object. */ 42725b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t symidx; 42825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the symbol in the symbol table of the output file. */ 42925b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t outsymidx; 43025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 43125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Description where the symbol is found/needed. */ 43225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t scndx; 43325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *file; 43425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the symbol table. */ 43525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word symscndx; 43625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 43725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the symbol in the dynamic symbol table of the output 43825b3c049e70834cf33790a28643ab058b507b35cBen Cheng file. Note that the value only needs to be 16 bit wide since 43925b3c049e70834cf33790a28643ab058b507b35cBen Cheng there cannot be more sections in an executable or DSO. */ 44025b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int outdynsymidx:16; 44125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 44225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Type of the symbol. */ 44325b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int type:4; 44425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Various flags. */ 44525b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int defined:1; 44625b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int common:1; 44725b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int weak:1; 44825b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int added:1; 44925b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int merged:1; 45025b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int local:1; 45125b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int hidden:1; 45225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Nonzero if the symbol is on the from_dso list. */ 45325b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int on_dsolist:1; 45425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Nonzero if symbol needs copy relocation, reset when the 45525b3c049e70834cf33790a28643ab058b507b35cBen Cheng relocation has been created. */ 45625b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int need_copy:1; 45725b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned int in_dso:1; 45825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 45925b3c049e70834cf33790a28643ab058b507b35cBen Cheng union 46025b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 46125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to the handle created by the functions which create 46225b3c049e70834cf33790a28643ab058b507b35cBen Cheng merged section contents. We use 'void *' because there are 46325b3c049e70834cf33790a28643ab058b507b35cBen Cheng different implementations used. */ 46425b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *handle; 46525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Addr value; 46625b3c049e70834cf33790a28643ab058b507b35cBen Cheng } merge; 46725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 46825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to next/previous symbol on whatever list the symbol is. */ 46925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *next; 47025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *previous; 47125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to next symbol of the same section (only set for merge-able 47225b3c049e70834cf33790a28643ab058b507b35cBen Cheng sections). */ 47325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *next_in_scn; 47425b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 47525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 47725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get the definition for the symbol table. */ 47825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <symbolhash.h> 47925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 48025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Simple single linked list of file names. */ 48125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct filename_list 48225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 48325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name; 48425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *real; 48525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct filename_list *next; 48625b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool group_start; 48725b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool group_end; 48825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool as_needed; 48925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 49025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 49125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 49225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data structure to describe expression in linker script. */ 49325b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct expression 49425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 49525b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum expression_tag 49625b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 49725b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_num, 49825b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_sizeof_headers, 49925b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_pagesize, 50025b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_id, 50125b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_mult, 50225b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_div, 50325b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_mod, 50425b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_plus, 50525b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_minus, 50625b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_and, 50725b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_or, 50825b3c049e70834cf33790a28643ab058b507b35cBen Cheng exp_align 50925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } tag; 51025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 51125b3c049e70834cf33790a28643ab058b507b35cBen Cheng union 51225b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 51325b3c049e70834cf33790a28643ab058b507b35cBen Cheng uintmax_t num; 51425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct expression *child; 51525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct 51625b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 51725b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct expression *left; 51825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct expression *right; 51925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } binary; 52025b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *str; 52125b3c049e70834cf33790a28643ab058b507b35cBen Cheng } val; 52225b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 52325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 52425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 52525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data structure for section name with flags. */ 52625b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct input_section_name 52725b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 52825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name; 52925b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool sort_flag; 53025b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 53125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 53225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* File name mask with section name. */ 53325b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct filemask_section_name 53425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 53525b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *filemask; 53625b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *excludemask; 53725b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct input_section_name *section_name; 53825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool keep_flag; 53925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 54025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 54125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data structure for assignments. */ 54225b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct assignment 54325b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 54425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *variable; 54525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct expression *expression; 54625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *sym; 54725b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool provide_flag; 54825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 54925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 55025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 55125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data structure describing input for an output section. */ 55225b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct input_rule 55325b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 55425b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum 55525b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 55625b3c049e70834cf33790a28643ab058b507b35cBen Cheng input_section, 55725b3c049e70834cf33790a28643ab058b507b35cBen Cheng input_assignment 55825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } tag; 55925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56025b3c049e70834cf33790a28643ab058b507b35cBen Cheng union 56125b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 56225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct assignment *assignment; 56325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct filemask_section_name *section; 56425b3c049e70834cf33790a28643ab058b507b35cBen Cheng } val; 56525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct input_rule *next; 56725b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 56825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 56925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 57025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data structure to describe output section. */ 57125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct output_section 57225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 57325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name; 57425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct input_rule *input; 57525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Addr max_alignment; 57625b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool ignored; 57725b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 57825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 57925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 58025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Data structure to describe output file format. */ 58125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct output_rule 58225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 58325b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum 58425b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 58525b3c049e70834cf33790a28643ab058b507b35cBen Cheng output_section, 58625b3c049e70834cf33790a28643ab058b507b35cBen Cheng output_assignment 58725b3c049e70834cf33790a28643ab058b507b35cBen Cheng } tag; 58825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 58925b3c049e70834cf33790a28643ab058b507b35cBen Cheng union 59025b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 59125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct assignment *assignment; 59225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct output_section section; 59325b3c049e70834cf33790a28643ab058b507b35cBen Cheng } val; 59425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 59525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct output_rule *next; 59625b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 59725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 59825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 59925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* List of all the segments the linker script describes. */ 60025b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct output_segment 60125b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 60225b3c049e70834cf33790a28643ab058b507b35cBen Cheng int mode; 60325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct output_rule *output_rules; 60425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct output_segment *next; 60525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 60625b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Off offset; 60725b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Addr addr; 60825b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Xword align; 60925b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 61025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 61125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 61225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* List of identifiers. */ 61325b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct id_list 61425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 61525b3c049e70834cf33790a28643ab058b507b35cBen Cheng union 61625b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 61725b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum id_type 61825b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 61925b3c049e70834cf33790a28643ab058b507b35cBen Cheng id_str, /* Normal string. */ 62025b3c049e70834cf33790a28643ab058b507b35cBen Cheng id_all, /* "*", matches all. */ 62125b3c049e70834cf33790a28643ab058b507b35cBen Cheng id_wild /* Globbing wildcard string. */ 62225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } id_type; 62325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct 62425b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 62525b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool local; 62625b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *versionname; 62725b3c049e70834cf33790a28643ab058b507b35cBen Cheng } s; 62825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } u; 62925b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *id; 63025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct id_list *next; 63125b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 63225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 63325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 63425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Version information. */ 63525b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct version 63625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 63725b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct version *next; 63825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct id_list *local_names; 63925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct id_list *global_names; 64025b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *versionname; 64125b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *parentname; 64225b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 64325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 64425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 64525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Head for list of sections. */ 64625b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct scnhead 64725b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 64825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name of the sections. */ 64925b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *name; 65025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 65125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Accumulated flags for the sections. */ 65225b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Xword flags; 65325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 65425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Type of the sections. */ 65525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Word type; 65625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 65725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Entry size. If there are differencs between the sections with 65825b3c049e70834cf33790a28643ab058b507b35cBen Cheng the same name this field contains 1. */ 65925b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Word entsize; 66025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 66125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If non-NULL pointer to group signature. */ 66225b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *grp_signature; 66325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 66425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Maximum alignment for all sections. */ 66525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Word align; 66625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 66725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Distinguish between normal sections coming from the input file 66825b3c049e70834cf33790a28643ab058b507b35cBen Cheng and sections generated by the linker. */ 66925b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum scn_kind 67025b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 67125b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_normal, /* Section from the input file(s). */ 67225b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_interp, /* Generated .interp section. */ 67325b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_got, /* Generated .got section. */ 67425b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_gotplt, /* Generated .got.plt section. */ 67525b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_dynrel, /* Generated .rel.dyn section. */ 67625b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_dynamic, /* Generated .dynamic section. */ 67725b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_dynsym, /* Generated .dynsym section. */ 67825b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_dynstr, /* Generated .dynstr section. */ 67925b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_hash, /* Generated .hash section. */ 68025b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_gnu_hash, /* Generated .gnu.hash section. */ 68125b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_plt, /* Generated .plt section. */ 68225b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_pltrel, /* Generated .rel.plt section. */ 68325b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_version, /* Generated .gnu.version section. */ 68425b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_version_r, /* Generated .gnu.version_r section. */ 68525b3c049e70834cf33790a28643ab058b507b35cBen Cheng scn_dot_note_gnu_build_id /* Generated .note.gnu.build-id section. */ 68625b3c049e70834cf33790a28643ab058b507b35cBen Cheng } kind; 68725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 68825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True is the section is used in the output. */ 68925b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool used; 69025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 69125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Total size (only determined this way for relocation sections). */ 69225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t relsize; 69325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 69425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Filled in by the section sorting to indicate which segment the 69525b3c049e70834cf33790a28643ab058b507b35cBen Cheng section goes in. */ 69625b3c049e70834cf33790a28643ab058b507b35cBen Cheng int segment_nr; 69725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 69825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the output section. We cannot store the section handle 69925b3c049e70834cf33790a28643ab058b507b35cBen Cheng directly here since the handle is a pointer in a dynamically 70025b3c049e70834cf33790a28643ab058b507b35cBen Cheng allocated table which might move if it becomes too small for all 70125b3c049e70834cf33790a28643ab058b507b35cBen Cheng the sections. Using the index the correct value can be found at 70225b3c049e70834cf33790a28643ab058b507b35cBen Cheng all times. */ 70325b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Word scnidx; 70425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 70525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the STT_SECTION entry for this section in the symbol 70625b3c049e70834cf33790a28643ab058b507b35cBen Cheng table. */ 70725b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Word scnsymidx; 70825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 70925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Address of the section in the output file. */ 71025b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Addr addr; 71125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 71225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Handle for the section name in the output file's section header 71325b3c049e70834cf33790a28643ab058b507b35cBen Cheng string table. */ 71425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Ebl_Strent *nameent; 71525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 71625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Tail of list of symbols for this section. Only set if the 71725b3c049e70834cf33790a28643ab058b507b35cBen Cheng section is merge-able. */ 71825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *symbols; 71925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 72025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to last section. */ 72125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo *last; 72225b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 72325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 72425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 72525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Define hash table for sections. */ 72625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <sectionhash.h> 72725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 72825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Define hash table for version symbols. */ 72925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <versionhash.h> 73025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* State of the linker. */ 73325b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct ld_state 73425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 73525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* ELF backend library handle. */ 73625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Ebl *ebl; 73725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 73825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of all archives participating, in this order. */ 73925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *archives; 74025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* End of the list. */ 74125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *tailarchives; 74225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If nonzero we are looking for the beginning of a group. */ 74325b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool group_start_requested; 74425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Pointer to the archive starting the group. */ 74525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *group_start_archive; 74625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 74725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of the DSOs we found. */ 74825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *dsofiles; 74925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of DSO files. */ 75025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t ndsofiles; 75125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Ultimate list of object files which are linked in. */ 75225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *relfiles; 75325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 75425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List the DT_NEEDED DSOs. */ 75525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *needed; 75625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 75725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Temporary storage for the parser. */ 75825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct filename_list *srcfiles; 75925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 76025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of all the paths to look at. */ 76125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *paths; 76225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Tail of the list. */ 76325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *tailpaths; 76425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 76525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* User provided paths for lookup of DSOs. */ 76625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *rpath; 76725b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *rpath_link; 76825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *runpath; 76925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *runpath_link; 77025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Ebl_Strent *rxxpath_strent; 77125b3c049e70834cf33790a28643ab058b507b35cBen Cheng int rxxpath_tag; 77225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 77325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* From the environment variable LD_LIBRARY_PATH. */ 77425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *ld_library_path1; 77525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *ld_library_path2; 77625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 77725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name of the output file. */ 77825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *outfname; 77925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name of the temporary file we initially create. */ 78025b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *tempfname; 78125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* File descriptor opened for the output file. */ 78225b3c049e70834cf33790a28643ab058b507b35cBen Cheng int outfd; 78325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The ELF descriptor for the output file. */ 78425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf *outelf; 78525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 78625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Type of output file. */ 78725b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum file_type file_type; 78825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 78925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Is this a system library or not. */ 79025b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool is_system_library; 79125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 79225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Page size to be assumed for the binary. */ 79325b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t pagesize; 79425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 79525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name of the interpreter for dynamically linked objects. */ 79625b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *interp; 79725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the .interp section. */ 79825b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word interpscnidx; 79925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 80025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Optimization level. */ 80125b3c049e70834cf33790a28643ab058b507b35cBen Cheng unsigned long int optlevel; 80225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 80325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If true static linking is requested. */ 80425b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool statically; 80525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 80625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If true, add DT_NEEDED entries for following files if they are 80725b3c049e70834cf33790a28643ab058b507b35cBen Cheng needed. */ 80825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool as_needed; 80925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 81025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* How to extract elements from archives. */ 81125b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum extract_rule extract_rule; 81225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 81325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Sequence number of the last archive we used. */ 81425b3c049e70834cf33790a28643ab058b507b35cBen Cheng int last_archive_used; 81525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 81625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If true print to stdout information about the files we are 81725b3c049e70834cf33790a28643ab058b507b35cBen Cheng trying to open. */ 81825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool trace_files; 81925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 82025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If true multiple definitions are not considered an error; the 82125b3c049e70834cf33790a28643ab058b507b35cBen Cheng first is used. */ 82225b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool muldefs; 82325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 82425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If true undefined symbols when building DSOs are not fatal. */ 82525b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool nodefs; 82625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 82725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If true add line indentifying link-editor to .comment section. */ 82825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool add_ld_comment; 82925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 83025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Stripping while linking. */ 83125b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum 83225b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 83325b3c049e70834cf33790a28643ab058b507b35cBen Cheng strip_none, 83425b3c049e70834cf33790a28643ab058b507b35cBen Cheng strip_debug, 83525b3c049e70834cf33790a28643ab058b507b35cBen Cheng strip_all, 83625b3c049e70834cf33790a28643ab058b507b35cBen Cheng strip_everything 83725b3c049e70834cf33790a28643ab058b507b35cBen Cheng } strip; 83825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 83925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The callback function vector. */ 84025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct callbacks callbacks; 84125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 84225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Name of the entry symbol. Can also be a numeric value. */ 84325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *entry; 84425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 84525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The description of the segments in the output file. */ 84625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct output_segment *output_segments; 84725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 84825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of the symbols we created from linker script definitions. */ 84925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *lscript_syms; 85025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nlscript_syms; 85125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 85225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Table with known symbols. */ 85325b3c049e70834cf33790a28643ab058b507b35cBen Cheng ld_symbol_tab symbol_tab; 85425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 85525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Table with used sections. */ 85625b3c049e70834cf33790a28643ab058b507b35cBen Cheng ld_section_tab section_tab; 85725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 85825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The list of sections once we collected them. */ 85925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scnhead **allsections; 86025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nallsections; 86125b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nusedsections; 86225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nnotesections; 86325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 86425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Beginning of the list of symbols which are still unresolved. */ 86525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *unresolved; 86625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of truely unresolved entries in the list. */ 86725b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nunresolved; 86825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of truely unresolved, non-weak entries in the list. */ 86925b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nunresolved_nonweak; 87025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 87125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of common symbols. */ 87225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *common_syms; 87325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Section for the common symbols. */ 87425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo *common_section; 87525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 87625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of symbols defined in DSOs and used in a relocatable file. 87725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DSO symbols not referenced in the relocatable files are not on 87825b3c049e70834cf33790a28643ab058b507b35cBen Cheng the list. If a symbol is on the list the on_dsolist field in the 87925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 'struct symbol' is nonzero. */ 88025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *from_dso; 88125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of entries in from_dso. */ 88225b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nfrom_dso; 88325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of entries in the dynamic symbol table. */ 88425b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t ndynsym; 88525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of PLT entries from DSO references. */ 88625b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nplt; 88725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of PLT entries from DSO references. */ 88825b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t ngot; 88925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of copy relocations. */ 89025b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t ncopy; 89125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Section for copy relocations. */ 89225b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo *copy_section; 89325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 89425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Keeping track of the number of symbols in the output file. */ 89525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nsymtab; 89625b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nlocalsymbols; 89725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 89825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Special symbols. */ 89925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *init_symbol; 90025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *fini_symbol; 90125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 90225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The description of the segments in the output file as described 90325b3c049e70834cf33790a28643ab058b507b35cBen Cheng in the default linker script. This information will be used in 90425b3c049e70834cf33790a28643ab058b507b35cBen Cheng addition to the user-provided information. */ 90525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct output_segment *default_output_segments; 90625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Search paths added by the default linker script. */ 90725b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct pathelement *default_paths; 90825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 90925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef BASE_ELF_NAME 91025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* The handle of the ld backend library. */ 91125b3c049e70834cf33790a28643ab058b507b35cBen Cheng void *ldlib; 91225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 91325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 91425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* String table for the section headers. */ 91525b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Ebl_Strtab *shstrtab; 91625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 91725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if output file should contain symbol table. */ 91825b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool need_symtab; 91925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Symbol table section. */ 92025b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word symscnidx; 92125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Extended section table section. */ 92225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word xndxscnidx; 92325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Symbol string table section. */ 92425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word strscnidx; 92525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 92625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if output file should contain dynamic symbol table. */ 92725b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool need_dynsym; 92825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Dynamic symbol table section. */ 92925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dynsymscnidx; 93025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Dynamic symbol string table section. */ 93125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dynstrscnidx; 93225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Dynamic symbol hash tables. */ 93325b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t hashscnidx; 93425b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t gnuhashscnidx; 93525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 93625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Procedure linkage table section. */ 93725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word pltscnidx; 93825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of entries already in the PLT section. */ 93925b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nplt_used; 94025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Relocation for procedure linkage table section. */ 94125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word pltrelscnidx; 94225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 94325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Global offset table section. */ 94425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word gotscnidx; 94525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* And the part of the PLT. */ 94625b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word gotpltscnidx; 94725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 94825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* This section will hole all non-PLT relocations. */ 94925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word reldynscnidx; 95025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 95125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of the sections to handle versioning. */ 95225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word versymscnidx; 95325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word verneedscnidx; 95425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* XXX Should the following names be verneed...? */ 95525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of version definitions in input DSOs used. */ 95625b3c049e70834cf33790a28643ab058b507b35cBen Cheng int nverdefused; 95725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of input DSOs using versioning. */ 95825b3c049e70834cf33790a28643ab058b507b35cBen Cheng int nverdeffile; 95925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index of next version. */ 96025b3c049e70834cf33790a28643ab058b507b35cBen Cheng int nextveridx; 96125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 96225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* TLS segment. */ 96325b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool need_tls; 96425b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Addr tls_start; 96525b3c049e70834cf33790a28643ab058b507b35cBen Cheng XElf_Addr tls_tcb; 96625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 96725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Hash table for version symbol strings. Only strings without 96825b3c049e70834cf33790a28643ab058b507b35cBen Cheng special characters are hashed here. */ 96925b3c049e70834cf33790a28643ab058b507b35cBen Cheng ld_version_str_tab version_str_tab; 97025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* At most one of the following two variables is set to true if either 97125b3c049e70834cf33790a28643ab058b507b35cBen Cheng global or local symbol binding is selected as the default. */ 97225b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool default_bind_local; 97325b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool default_bind_global; 97425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 97525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Execuatable stack selection. */ 97625b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum execstack 97725b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 97825b3c049e70834cf33790a28643ab058b507b35cBen Cheng execstack_false = 0, 97925b3c049e70834cf33790a28643ab058b507b35cBen Cheng execstack_true, 98025b3c049e70834cf33790a28643ab058b507b35cBen Cheng execstack_false_force 98125b3c049e70834cf33790a28643ab058b507b35cBen Cheng } execstack; 98225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 98325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if only used sections are used. */ 98425b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool gc_sections; 98525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 98625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Array to determine final index of symbol. */ 98725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word *dblindirect; 98825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 98925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Section group handling. */ 99025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scngroup 99125b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 99225b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word outscnidx; 99325b3c049e70834cf33790a28643ab058b507b35cBen Cheng int nscns; 99425b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct member 99525b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 99625b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scnhead *scn; 99725b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct member *next; 99825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } *member; 99925b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct Ebl_Strent *nameent; 100025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *symbol; 100125b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scngroup *next; 100225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } *groups; 100325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 100425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if the output file needs a .got section. */ 100525b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool need_got; 100625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of relocations for GOT section caused. */ 100725b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t nrel_got; 100825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 100925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Number of entries needed in the .dynamic section. */ 101025b3c049e70834cf33790a28643ab058b507b35cBen Cheng int ndynamic; 101125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* To keep track of added entries. */ 101225b3c049e70834cf33790a28643ab058b507b35cBen Cheng int ndynamic_filled; 101325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Index for the dynamic section. */ 101425b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dynamicscnidx; 101525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 101625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Flags set in the DT_FLAGS word. */ 101725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dt_flags; 101825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Flags set in the DT_FLAGS_1 word. */ 101925b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dt_flags_1; 102025b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Flags set in the DT_FEATURE_1 word. */ 102125b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word dt_feature_1; 102225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 102325b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Lazy-loading state for dependencies. */ 102425b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool lazyload; 102525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 102625b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if an .eh_frame_hdr section should be generated. */ 102725b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool eh_frame_hdr; 102825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 102925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* What hash style to generate. */ 103025b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum 103125b3c049e70834cf33790a28643ab058b507b35cBen Cheng { 103225b3c049e70834cf33790a28643ab058b507b35cBen Cheng hash_style_none = 0, 103325b3c049e70834cf33790a28643ab058b507b35cBen Cheng hash_style_sysv = 1, 103425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define GENERATE_SYSV_HASH ((ld_state.hash_style & hash_style_sysv) != 0) 103525b3c049e70834cf33790a28643ab058b507b35cBen Cheng hash_style_gnu = 2 103625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define GENERATE_GNU_HASH ((ld_state.hash_style & hash_style_gnu) != 0) 103725b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 103825b3c049e70834cf33790a28643ab058b507b35cBen Cheng hash_style; 103925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 104025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 104125b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* True if in executables all global symbols should be exported in 104225b3c049e70834cf33790a28643ab058b507b35cBen Cheng the dynamic symbol table. */ 104325b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool export_all_dynamic; 104425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 104525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Build-ID style. NULL is none. */ 104625b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *build_id; 104725b3c049e70834cf33790a28643ab058b507b35cBen Cheng Elf32_Word buildidscnidx; 104825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 104925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If DSO is generated, this is the SONAME. */ 105025b3c049e70834cf33790a28643ab058b507b35cBen Cheng const char *soname; 105125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 105225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* List of all relocation sections. */ 105325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct scninfo *rellist; 105425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Total size of non-PLT relocations. */ 105525b3c049e70834cf33790a28643ab058b507b35cBen Cheng size_t relsize_total; 105625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 105725b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Record for the GOT symbol, if known. */ 105825b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *got_symbol; 105925b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Record for the dynamic section symbol, if known. */ 106025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *dyn_symbol; 106125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 106225b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* Obstack used for small objects which will not be deleted. */ 106325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct obstack smem; 106425b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 106525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 106625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 106725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* The interface to the scanner. */ 106825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 106925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Parser entry point. */ 107025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ldparse (void); 107125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 107225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* The input file. */ 107325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern FILE *ldin; 107425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 107525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Name of the input file. */ 107625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ldin_fname; 107725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 107825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Current line number. Must be reset for a new file. */ 107925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ldlineno; 108025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 108125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* If nonzero we are currently parsing a version script. */ 108225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ld_scan_version_script; 108325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 108425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Flags defined in ld.c. */ 108525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int verbose; 108625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int conserve_memory; 108725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 108825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 108925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Linker state. This contains all global information. */ 109025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct ld_state ld_state; 109125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 109225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 109325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Generic ld helper functions. */ 109425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 109525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Append a new directory to search libraries in. */ 109625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ld_new_searchdir (const char *dir); 109725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 109825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Append a new file to the list of input files. */ 109925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct usedfiles *ld_new_inputfile (const char *fname, 110025b3c049e70834cf33790a28643ab058b507b35cBen Cheng enum file_type type); 110125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 110225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 110325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* These are the generic implementations for the callbacks used by ld. */ 110425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 110525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Initialize state object. This callback function is called after the 110625b3c049e70834cf33790a28643ab058b507b35cBen Cheng parameters are parsed but before any file is searched for. */ 110725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ld_prepare_state (const char *emulation); 110825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 110925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 111025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Function to determine whether an object will be dynamically linked. */ 111125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool dynamically_linked_p (void); 111225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 111325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Helper functions for the architecture specific code. */ 111425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 111525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Checked whether the symbol is undefined and referenced from a DSO. */ 111625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool linked_from_dso_p (struct scninfo *scninfo, size_t symidx); 111725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __GNUC_STDC_INLINE__ 111825b3c049e70834cf33790a28643ab058b507b35cBen Cheng__attribute__ ((__gnu_inline__)) 111925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif 112025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern inline bool 112125b3c049e70834cf33790a28643ab058b507b35cBen Chenglinked_from_dso_p (struct scninfo *scninfo, size_t symidx) 112225b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 112325b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct usedfiles *file = scninfo->fileinfo; 112425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 112525b3c049e70834cf33790a28643ab058b507b35cBen Cheng /* If this symbol is not undefined in this file it cannot come from 112625b3c049e70834cf33790a28643ab058b507b35cBen Cheng a DSO. */ 112725b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (symidx < file->nlocalsymbols) 112825b3c049e70834cf33790a28643ab058b507b35cBen Cheng return false; 112925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 113025b3c049e70834cf33790a28643ab058b507b35cBen Cheng struct symbol *sym = file->symref[symidx]; 113125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 113225b3c049e70834cf33790a28643ab058b507b35cBen Cheng return sym->defined && sym->in_dso; 113325b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 113425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 113525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif /* ld.h */ 1136