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