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