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