1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Copyright (C) 2001, 2002, 2003, 2005, 2006, 2008 Red Hat, Inc.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
3441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
8441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
25441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef LD_H
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define LD_H	1
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <dlfcn.h>
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <obstack.h>
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdbool.h>
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdio.h>
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "xelf.h"
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Recommended size of the buffer passed to ld_strerror.  */
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ERRBUFSIZE	(512)
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Character used to introduce version name after symbol.  */
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define VER_CHR	'@'
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Methods for handling archives.  */
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum extract_rule
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    defaultextract,	/* Weak references don't cause archive member to
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			   be used.  */
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    weakextract,	/* Weak references cause archive member to be
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			   extracted.  */
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    allextract		/* Extract all archive members regardless of
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			   references (aka whole-archive).  */
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Type of output file.  */
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectenum file_type
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    no_file_type = 0,		/* None selected so far.  */
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    executable_file_type,	/* Executable.  */
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    dso_file_type,		/* DSO.  */
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    dso_needed_file_type,	/* DSO introduced by DT_NEEDED.  */
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    relocatable_file_type,	/* Relocatable object file.  */
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    archive_file_type		/* Archive (input only).  */
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct usedfiles
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The next file given at the command line.  */
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *next;
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Nonzero if this file is the beginning of a group.  */
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool group_start;
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Nonzero if this file is the end of a group.  */
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool group_end;
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Pointer to the beginning of the group.  It is necessary to
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     explain why we cannot simply use the 'next' pointer and have a
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     circular single-linked list like in many cases.  The problem is
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     that the last archive of the group, if it is the last file of the
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     group, contains the only existing pointer to the next file we
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     have to look at.  All files are initially connected via the
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     'next' pointer in a single-linked list.  Therefore we cannot
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     overwrite this value.  It instead will be used once the group is
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     handled and we go on processing the rest of the files.  */
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *group_backref;
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name/path of the file.  */
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *fname;
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Resolved file name.  */
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *rfname;
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name used as reference in DT_NEEDED entries.  This is normally
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the SONAME.  If it is missing it's normally the fname above.  */
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *soname;
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Handle for the SONAME in the string table.  */
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Ebl_Strent *sonameent;
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Help to identify duplicates.  */
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  dev_t dev;
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ino_t ino;
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      not_opened,
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      opened,
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      in_archive,
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      closed
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } status;
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* How to extract elements from archives.  */
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum extract_rule extract_rule;
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Lazy-loading rule.  */
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool lazyload;
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If this is a DSO the flag indicates whether the file is directly
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     used in a reference.  */
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool used;
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
118cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* True when file should be added to DT_NEEDED list only when
119cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     directly referenced.  */
120cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool as_needed;
121cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If nonzero this is the archive sequence number which can be used to
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     determine whether back refernces from -( -) or GROUP statements
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     have to be followed.  */
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int archive_seq;
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Pointer to the record for the archive containing this file.  */
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *archive_file;
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Type of file.  We have to distinguish these types since they
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     are searched for differently.  */
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum file_type file_type;
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* This is the ELF library handle for this file.  */
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *elf;
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The ELF header.  */
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#if NATIVE_ELF != 0
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Ehdr *ehdr;
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define FILEINFO_EHDR(fi) (*(fi))
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#else
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Ehdr ehdr;
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define FILEINFO_EHDR(fi) (fi)
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the section header string table section.  We use a
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     separate field and not the e_shstrndx field in the ELF header
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     since in case of a file with more than 64000 sections the index
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     might be stored in the section header of section zero.  The
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     elf_getshstrndx() function can find the value but it is too
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     costly to repeat this call over and over.  */
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t shstrndx;
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Info about the sections of the file.  */
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scninfo
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Handle for the section.  Note that we can store a section
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       handle here because the file is not changing.  This together
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       with the knowledge about the libelf library is enough for us to
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       assume the section reference remains valid at all times.  */
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf_Scn *scn;
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Section header.  */
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#if NATIVE_ELF != 0
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    XElf_Shdr *shdr;
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define SCNINFO_SHDR(si) (*(si))
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#else
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    XElf_Shdr shdr;
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# define SCNINFO_SHDR(si) (si)
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Offset of this files section in the combined section.  */
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    XElf_Off offset;
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Index of the section in the output file.  */
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf32_Word outscnndx;
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Index of the output section in the 'allsection' array.  */
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf32_Word allsectionsidx;
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* True if the section is used.  */
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    bool used;
177cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    /* True if section is an unused COMDAT section.  */
178cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    bool unused_comdat;
179cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    /* True if this is a COMDAT group section.  */
180cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    bool comdat_group;
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Section group number.  This is the index of the SHT_GROUP section.  */
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf32_Word grpid;
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Pointer back to the containing file information structure.  */
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct usedfiles *fileinfo;
185cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    /* List of symbols in this section (set only for merge-able sections
186cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng       and group sections).  */
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct symbol *symbols;
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Size of relocations in this section.  Only used for relocation
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       sections.  */
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    size_t relsize;
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Pointer to next section which is put in the given output
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       section.  */
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct scninfo *next;
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } *scninfo;
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of section group sections.  */
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scninfo *groups;
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The symbol table section.
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     XXX Maybe support for more than one symbol table is needed.  */
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *symtabdata;
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Extra section index table section.  */
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *xndxdata;
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Dynamic symbol table section.  */
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *dynsymtabdata;
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The version number section.  */
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *versymdata;
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The defined versions.  */
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *verdefdata;
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of versions defined.  */
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nverdef;
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if the version with the given index number is used in the
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     output.  */
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Versym *verdefused;
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* How many versions are used.  */
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nverdefused;
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Handle for name of the version.  */
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Ebl_Strent **verdefent;
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The needed versions.  */
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Data *verneeddata;
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* String table section associated with the symbol table.  */
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word symstridx;
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* String table section associated with the dynamic symbol table.  */
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dynsymstridx;
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of entries in the symbol table.  */
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nsymtab;
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nlocalsymbols;
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t ndynsymtab;
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Dynamic section.  */
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf_Scn *dynscn;
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Indirection table for the symbols defined here.  */
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word *symindirect;
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word *dynsymindirect;
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* For undefined or common symbols we need a reference to the symbol
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     record.  */
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol **symref;
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol **dynsymref;
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* This is the file descriptor.  The value is -1 if the descriptor
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     was already closed.  This can happen if we needed file descriptors
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     to open new files.  */
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int fd;
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* This flag is true if the descriptor was passed to the generic
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     functions from somewhere else.  This is an implementation detail;
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     no machine-specific code must use this flag.  */
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool fd_passed;
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if any of the sections is merge-able.  */
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool has_merge_sections;
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Functions to test for the various types of files we handle.  */
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic inline int
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectld_file_rel_p (struct usedfiles *file)
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return (elf_kind (file->elf) == ELF_K_ELF
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  && FILEINFO_EHDR (file->ehdr).e_type == ET_REL);
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic inline int
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectld_file_dso_p (struct usedfiles *file)
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return (elf_kind (file->elf) == ELF_K_ELF
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  && FILEINFO_EHDR (file->ehdr).e_type == ET_DYN);
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic inline int
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectld_file_ar_p (struct usedfiles *file)
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return elf_kind (file->elf) == ELF_K_AR;
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct pathelement
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The next path to search.  */
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *next;
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The path name.  */
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *pname;
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Larger than zero if the directory exists, smaller than zero if not,
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     zero if it is not yet known.  */
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int exist;
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Forward declaration.  */
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct ld_state;
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Callback functions.  */
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct callbacks
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Library names passed to the linker as -lXXX represent files named
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     libXXX.YY.  The YY part can have different forms, depending on the
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     architecture.  The generic set is .so and .a (in this order).  */
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char **(*lib_extensions) (struct ld_state *)
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       __attribute__ ((__const__));
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define LIB_EXTENSION(state) \
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.lib_extensions, (state))
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Process the given file.  If the file is not yet open, open it.
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     The first parameter is a file descriptor for the file which can
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     be -1 to indicate the file has not yet been found.  The second
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     parameter describes the file to be opened, the last one is the
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     state of the linker which among other information contain the
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     paths we look at.*/
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*file_process) (int fd, struct usedfiles *, struct ld_state *,
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		       struct usedfiles **);
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define FILE_PROCESS(fd, file, state, nextp) \
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.file_process, (fd, file, state, nextp))
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Close the given file.  */
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*file_close) (struct usedfiles *, struct ld_state *);
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define FILE_CLOSE(file, state) \
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.file_close, (file, state))
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the output sections now.  This requires knowledge about
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     all the sections we will need.  It may be necessary to sort the
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     sections in the order they are supposed to appear in the
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     executable.  The sorting use many different kinds of information
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     to optimize the resulting binary.  Important is to respect
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     segment boundaries and the needed alignment.  The mode of the
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     segments will be determined afterwards automatically by the
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     output routines.  */
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*create_sections) (struct ld_state *);
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define CREATE_SECTIONS(state) \
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.create_sections, (state))
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Determine whether we have any non-weak unresolved references left.  */
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*flag_unresolved) (struct ld_state *);
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define FLAG_UNRESOLVED(state) \
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.flag_unresolved, (state))
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the sections which are generated by the linker and are not
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     present in the input file.  */
339441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*generate_sections) (struct ld_state *);
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define GENERATE_SECTIONS(state) \
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.generate_sections, (state))
342441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Open the output file.  The file name is given or "a.out".  We
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     create as much of the ELF structure as possible.  */
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*open_outfile) (struct ld_state *, int, int, int);
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define OPEN_OUTFILE(state, machine, class, data) \
347441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.open_outfile, (state, machine, class, data))
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the data for the output file.  */
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*create_outfile) (struct ld_state *);
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define CREATE_OUTFILE(state) \
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.create_outfile, (state))
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Process a relocation section.  */
355441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*relocate_section) (struct ld_state *, Elf_Scn *, struct scninfo *,
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			    const Elf32_Word *);
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define RELOCATE_SECTION(state, outscn, first, dblindirect) \
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.relocate_section, (state, outscn, first,    \
359441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project						     dblindirect))
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Allocate a data buffer for the relocations of the given output
362441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     section.  */
363441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*count_relocations) (struct ld_state *, struct scninfo *);
364441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define COUNT_RELOCATIONS(state, scninfo) \
365441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.count_relocations, (state, scninfo))
366441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
367441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create relocations for executable or DSO.  */
368441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*create_relocations) (struct ld_state *, const Elf32_Word *);
369441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define CREATE_RELOCATIONS(state, dlbindirect) \
370441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.create_relocations, (state, dblindirect))
371441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
372441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Finalize the output file.  */
373441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*finalize) (struct ld_state *);
374441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define FINALIZE(state) \
375441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.finalize, (state))
376441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
377441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Check whether special section number is known.  */
378441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool (*special_section_number_p) (struct ld_state *, size_t);
379441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define SPECIAL_SECTION_NUMBER_P(state, number) \
380441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.special_section_number_p, (state, number))
381441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
382441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Check whether section type is known.  */
383441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool (*section_type_p) (struct ld_state *, XElf_Word);
384441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define SECTION_TYPE_P(state, type) \
385441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.section_type_p, (state, type))
386441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
387441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Return section flags for .dynamic section.  */
388441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Xword (*dynamic_section_flags) (struct ld_state *);
389441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define DYNAMIC_SECTION_FLAGS(state) \
390441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.dynamic_section_flags, (state))
391441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
392441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the data structures for the .plt section and initialize it.  */
393441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*initialize_plt) (struct ld_state *, Elf_Scn *scn);
394441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define INITIALIZE_PLT(state, scn) \
395441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.initialize_plt, (state, scn))
396441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
397441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the data structures for the .rel.plt section and initialize it.  */
398441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*initialize_pltrel) (struct ld_state *, Elf_Scn *scn);
399441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define INITIALIZE_PLTREL(state, scn) \
400441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.initialize_pltrel, (state, scn))
401441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
402441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Finalize the .plt section the what belongs to them.  */
403cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  void (*finalize_plt) (struct ld_state *, size_t, size_t, struct symbol **);
404cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define FINALIZE_PLT(state, nsym, nsym_dyn, ndxtosym) \
405cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DL_CALL_FCT ((state)->callbacks.finalize_plt, (state, nsym, nsym_dyn, \
406cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng						 ndxtosym))
407441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
408441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the data structures for the .got section and initialize it.  */
409441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void (*initialize_got) (struct ld_state *, Elf_Scn *scn);
410441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define INITIALIZE_GOT(state, scn) \
411441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.initialize_got, (state, scn))
412441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
413cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Create the data structures for the .got.plt section and initialize it.  */
414cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  void (*initialize_gotplt) (struct ld_state *, Elf_Scn *scn);
415cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define INITIALIZE_GOTPLT(state, scn) \
416cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DL_CALL_FCT ((state)->callbacks.initialize_gotplt, (state, scn))
417cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
418441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Return the tag corresponding to the native relocation type for
419441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the platform.  */
420441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int (*rel_type) (struct ld_state *);
421441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define REL_TYPE(state) \
422441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  DL_CALL_FCT ((state)->callbacks.rel_type, (state))
423441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
424441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
425441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
426441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Structure for symbol representation.  This data structure is used a
427441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   lot, so size is important.  */
428441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct symbol
429441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
430441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Symbol name.  */
431441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
432441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Size of the object.  */
433441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Xword size;
434441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the symbol in the symbol table of the object.  */
435441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t symidx;
436441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the symbol in the symbol table of the output file.  */
437441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t outsymidx;
438441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
439441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Description where the symbol is found/needed.  */
440441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t scndx;
441441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *file;
442441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the symbol table.  */
443441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word symscndx;
444441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
445441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the symbol in the dynamic symbol table of the output
446441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     file.  Note that the value only needs to be 16 bit wide since
447441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     there cannot be more sections in an executable or DSO.  */
448441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int outdynsymidx:16;
449441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
450441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Type of the symbol.  */
451441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int type:4;
452441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Various flags.  */
453441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int defined:1;
454441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int common:1;
455441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int weak:1;
456441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int added:1;
457441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int merged:1;
458cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  unsigned int local:1;
459cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  unsigned int hidden:1;
460441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Nonzero if the symbol is on the from_dso list.  */
461441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int on_dsolist:1;
462441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Nonzero if symbol needs copy relocation, reset when the
463441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     relocation has been created.  */
464441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int need_copy:1;
465441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned int in_dso:1;
466441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
467441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
468441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
469441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Pointer to the handle created by the functions which create
470441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       merged section contents.  We use 'void *' because there are
471441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project       different implementations used.  */
472441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    void *handle;
473441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    XElf_Addr value;
474441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } merge;
475441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
476441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Pointer to next/previous symbol on whatever list the symbol is.  */
477441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *next;
478441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *previous;
479441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Pointer to next symbol of the same section (only set for merge-able
480441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     sections).  */
481441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *next_in_scn;
482441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
483441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
484441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
485441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get the definition for the symbol table.  */
486441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <symbolhash.h>
487441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
488441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Simple single linked list of file names.  */
489441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct filename_list
490441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
491441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
492441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *real;
493441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct filename_list *next;
494441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool group_start;
495441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool group_end;
496cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool as_needed;
497441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
498441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
499441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
500441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Data structure to describe expression in linker script.  */
501441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct expression
502441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
503441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum expression_tag
504441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
505441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_num,
506441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_sizeof_headers,
507441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_pagesize,
508441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_id,
509441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_mult,
510441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_div,
511441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_mod,
512441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_plus,
513441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_minus,
514441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_and,
515441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_or,
516441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      exp_align
517441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } tag;
518441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
519441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
520441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
521441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    uintmax_t num;
522441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct expression *child;
523441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
524441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
525441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct expression *left;
526441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct expression *right;
527441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } binary;
528441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    const char *str;
529441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } val;
530441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
531441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
532441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
533441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Data structure for section name with flags.  */
534441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct input_section_name
535441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
536441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
537441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool sort_flag;
538441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
539441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
540441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* File name mask with section name.  */
541441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct filemask_section_name
542441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
543441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *filemask;
544441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *excludemask;
545441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_section_name *section_name;
546441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool keep_flag;
547441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
548441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
549441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Data structure for assignments.  */
550441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct assignment
551441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
552441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *variable;
553441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct expression *expression;
554441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *sym;
555441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool provide_flag;
556441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
557441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
558441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
559441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Data structure describing input for an output section.  */
560441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct input_rule
561441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
562441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum
563441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
564441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      input_section,
565441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      input_assignment
566441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } tag;
567441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
568441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
569441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
570441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct assignment *assignment;
571441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct filemask_section_name *section;
572441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } val;
573441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
574441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_rule *next;
575441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
576441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
577441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
578441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Data structure to describe output section.  */
579441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct output_section
580441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
581441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
582441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_rule *input;
583441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Addr max_alignment;
584441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool ignored;
585441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
586441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
587441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
588441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Data structure to describe output file format.  */
589441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct output_rule
590441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
591441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum
592441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
593441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      output_section,
594441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      output_assignment
595441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } tag;
596441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
597441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
598441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
599441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct assignment *assignment;
600441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct output_section section;
601441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } val;
602441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
603441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_rule *next;
604441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
605441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
606441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
607441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* List of all the segments the linker script describes.  */
608441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct output_segment
609441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
610441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int mode;
611441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_rule *output_rules;
612441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_segment *next;
613441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
614441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Off offset;
615441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Addr addr;
616441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Xword align;
617441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
618441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
619441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
620441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* List of identifiers.  */
621441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct id_list
622441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
623441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  union
624441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
625441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    enum id_type
626441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {
627441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	id_str,		/* Normal string.  */
628441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	id_all,		/* "*", matches all.  */
629441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	id_wild		/* Globbing wildcard string.  */
630441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      } id_type;
631441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct
632441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
633441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      bool local;
634441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      const char *versionname;
635441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } s;
636441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } u;
637441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *id;
638441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct id_list *next;
639441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
640441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
641441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
642441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Version information.  */
643441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct version
644441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
645441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct version *next;
646441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct id_list *local_names;
647441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct id_list *global_names;
648441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *versionname;
649441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *parentname;
650441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
651441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
652441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
653441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Head for list of sections.  */
654441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct scnhead
655441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
656441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name of the sections.  */
657441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *name;
658441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
659441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Accumulated flags for the sections.  */
660441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Xword flags;
661441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
662441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Type of the sections.  */
663441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Word type;
664441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
665441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Entry size.  If there are differencs between the sections with
666441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the same name this field contains 1.  */
667441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Word entsize;
668441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
669441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If non-NULL pointer to group signature.  */
670441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *grp_signature;
671441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
672441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Maximum alignment for all sections.  */
673441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Word align;
674441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
675441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Distinguish between normal sections coming from the input file
676441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     and sections generated by the linker.  */
677441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum scn_kind
678441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
679441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_normal,		/* Section from the input file(s).  */
680441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_interp,		/* Generated .interp section.  */
681441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_got,		/* Generated .got section.  */
682cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      scn_dot_gotplt,		/* Generated .got.plt section.  */
683441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_dynrel,		/* Generated .rel.dyn section.  */
684441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_dynamic,		/* Generated .dynamic section.  */
685441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_dynsym,		/* Generated .dynsym section.  */
686441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_dynstr,		/* Generated .dynstr section.  */
687441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_hash,		/* Generated .hash section.  */
688cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      scn_dot_gnu_hash,		/* Generated .gnu.hash section.  */
689441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_plt,		/* Generated .plt section.  */
690441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_pltrel,		/* Generated .rel.plt section.  */
691441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn_dot_version,		/* Generated .gnu.version section.  */
692cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      scn_dot_version_r,	/* Generated .gnu.version_r section.  */
693cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      scn_dot_note_gnu_build_id	/* Generated .note.gnu.build-id section.  */
694441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } kind;
695441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
696441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True is the section is used in the output.  */
697441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool used;
698441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
699441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Total size (only determined this way for relocation sections).  */
700441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t relsize;
701441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
702441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Filled in by the section sorting to indicate which segment the
703441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     section goes in.  */
704441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int segment_nr;
705441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
706441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the output section.  We cannot store the section handle
707441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     directly here since the handle is a pointer in a dynamically
708441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     allocated table which might move if it becomes too small for all
709441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the sections.  Using the index the correct value can be found at
710441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     all times.  */
711441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Word scnidx;
712441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
713441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the STT_SECTION entry for this section in the symbol
714441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     table.  */
715441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Word scnsymidx;
716441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
717441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Address of the section in the output file.  */
718441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  XElf_Addr addr;
719441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
720441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Handle for the section name in the output file's section header
721441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     string table.  */
722441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Ebl_Strent *nameent;
723441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
724441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Tail of list of symbols for this section.  Only set if the
725441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     section is merge-able.  */
726441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *symbols;
727441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
728441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Pointer to last section.  */
729441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scninfo *last;
730441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
731441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
732441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
733441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Define hash table for sections.  */
734441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <sectionhash.h>
735441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
736441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Define hash table for version symbols.  */
737441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <versionhash.h>
738441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
739441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
740441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* State of the linker.  */
741441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct ld_state
742441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
743441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* ELF backend library handle.  */
744441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Ebl *ebl;
745441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
746441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of all archives participating, in this order.  */
747441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *archives;
748441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* End of the list.  */
749441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *tailarchives;
750441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If nonzero we are looking for the beginning of a group.  */
751441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool group_start_requested;
752441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Pointer to the archive starting the group.  */
753441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *group_start_archive;
754441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
755441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of the DSOs we found.  */
756441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *dsofiles;
757441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of DSO files.  */
758441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t ndsofiles;
759441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Ultimate list of object files which are linked in.  */
760441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *relfiles;
761441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
762441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List the DT_NEEDED DSOs.  */
763441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *needed;
764441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
765441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Temporary storage for the parser.  */
766441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct filename_list *srcfiles;
767441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
768441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of all the paths to look at.  */
769441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *paths;
770441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Tail of the list.  */
771441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *tailpaths;
772441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
773441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* User provided paths for lookup of DSOs.  */
774441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *rpath;
775441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *rpath_link;
776441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *runpath;
777441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *runpath_link;
778441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Ebl_Strent *rxxpath_strent;
779441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int rxxpath_tag;
780441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
781441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* From the environment variable LD_LIBRARY_PATH.  */
782441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *ld_library_path1;
783441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *ld_library_path2;
784441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
785441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name of the output file.  */
786441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *outfname;
787441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name of the temporary file we initially create.  */
788441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *tempfname;
789441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* File descriptor opened for the output file.  */
790441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int outfd;
791441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The ELF descriptor for the output file.  */
792441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *outelf;
793441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
794441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Type of output file.  */
795441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum file_type file_type;
796441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
797441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Is this a system library or not.  */
798441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool is_system_library;
799441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
800441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Page size to be assumed for the binary.  */
801441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t pagesize;
802441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
803441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name of the interpreter for dynamically linked objects.  */
804441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *interp;
805441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the .interp section.  */
806441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word interpscnidx;
807441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
808441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Optimization level.  */
809441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unsigned long int optlevel;
810441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
811441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true static linking is requested.  */
812441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool statically;
813441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
814cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* If true, add DT_NEEDED entries for following files if they are
815cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     needed.  */
816cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool as_needed;
817cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
818441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* How to extract elements from archives.  */
819441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum extract_rule extract_rule;
820441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
821441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Sequence number of the last archive we used.  */
822441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int last_archive_used;
823441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
824441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true print to stdout information about the files we are
825441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     trying to open.  */
826441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool trace_files;
827441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
828441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true multiple definitions are not considered an error; the
829441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     first is used.  */
830441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool muldefs;
831441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
832441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true undefined symbols when building DSOs are not fatal.  */
833441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool nodefs;
834441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
835441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If true add line indentifying link-editor to .comment section.  */
836441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool add_ld_comment;
837441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
838441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Stripping while linking.  */
839441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum
840441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
841441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      strip_none,
842441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      strip_debug,
843441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      strip_all,
844441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      strip_everything
845441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } strip;
846441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
847441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The callback function vector.  */
848441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct callbacks callbacks;
849441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
850441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Name of the entry symbol.  Can also be a numeric value.  */
851441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *entry;
852441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
853441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The description of the segments in the output file.  */
854441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_segment *output_segments;
855441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
856441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of the symbols we created from linker script definitions.  */
857441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *lscript_syms;
858441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nlscript_syms;
859441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
860441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Table with known symbols.  */
861441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ld_symbol_tab symbol_tab;
862441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
863441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Table with used sections.  */
864441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ld_section_tab section_tab;
865441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
866441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The list of sections once we collected them.   */
867441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scnhead **allsections;
868441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nallsections;
869441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nusedsections;
870441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nnotesections;
871441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
872441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Beginning of the list of symbols which are still unresolved.  */
873441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *unresolved;
874441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of truely unresolved entries in the list.  */
875441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nunresolved;
876441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of truely unresolved, non-weak entries in the list.  */
877441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nunresolved_nonweak;
878441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
879441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of common symbols.  */
880441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *common_syms;
881441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Section for the common symbols.  */
882441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scninfo *common_section;
883441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
884441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of symbols defined in DSOs and used in a relocatable file.
885441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     DSO symbols not referenced in the relocatable files are not on
886441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the list.  If a symbol is on the list the on_dsolist field in the
887441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     'struct symbol' is nonzero.  */
888441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *from_dso;
889441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of entries in from_dso.  */
890441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nfrom_dso;
891441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of entries in the dynamic symbol table.  */
892441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t ndynsym;
893441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of PLT entries from DSO references.  */
894441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nplt;
895441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of PLT entries from DSO references.  */
896441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t ngot;
897441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of copy relocations.  */
898441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t ncopy;
899441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Section for copy relocations.  */
900441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scninfo *copy_section;
901441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
902441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Keeping track of the number of symbols in the output file.  */
903441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nsymtab;
904441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nlocalsymbols;
905441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
906441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Special symbols.  */
907441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *init_symbol;
908441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *fini_symbol;
909441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
910441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The description of the segments in the output file as described
911441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     in the default linker script.  This information will be used in
912441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     addition to the user-provided information.  */
913441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_segment *default_output_segments;
914441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Search paths added by the default linker script.  */
915441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct pathelement *default_paths;
916441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
917441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef BASE_ELF_NAME
918441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* The handle of the ld backend library.  */
919441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  void *ldlib;
920441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
921441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
922441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* String table for the section headers.  */
923441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct Ebl_Strtab *shstrtab;
924441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
925441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if output file should contain symbol table.  */
926441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool need_symtab;
927441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Symbol table section.  */
928441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word symscnidx;
929441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Extended section table section.  */
930441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word xndxscnidx;
931441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Symbol string table section.  */
932441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word strscnidx;
933441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
934441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if output file should contain dynamic symbol table.  */
935441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool need_dynsym;
936441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Dynamic symbol table section.  */
937441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dynsymscnidx;
938441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Dynamic symbol string table section.  */
939441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dynstrscnidx;
940cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Dynamic symbol hash tables.  */
941441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t hashscnidx;
942cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  size_t gnuhashscnidx;
943441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
944441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Procedure linkage table section.  */
945441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word pltscnidx;
946441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of entries already in the PLT section.  */
947441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nplt_used;
948441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Relocation for procedure linkage table section.  */
949441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word pltrelscnidx;
950441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
951441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Global offset table section.  */
952441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word gotscnidx;
953cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* And the part of the PLT.  */
954cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf32_Word gotpltscnidx;
955441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
956441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* This section will hole all non-PLT relocations.  */
957441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word reldynscnidx;
958441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
959441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of the sections to handle versioning.  */
960441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word versymscnidx;
961441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word verneedscnidx;
962441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* XXX Should the following names be verneed...?  */
963441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of version definitions in input DSOs used.  */
964441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int nverdefused;
965441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of input DSOs using versioning.  */
966441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int nverdeffile;
967441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index of next version.  */
968441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int nextveridx;
969441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
970cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* TLS segment.  */
971cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool need_tls;
972cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  XElf_Addr tls_start;
973cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  XElf_Addr tls_tcb;
974cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
975441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Hash table for version symbol strings.  Only strings without
976441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     special characters are hashed here.  */
977441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ld_version_str_tab version_str_tab;
978441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* At most one of the following two variables is set to true if either
979441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     global or local symbol binding is selected as the default.  */
980441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool default_bind_local;
981441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool default_bind_global;
982441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
983cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Execuatable stack selection.  */
984cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  enum execstack
985cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
986cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      execstack_false = 0,
987cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      execstack_true,
988cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      execstack_false_force
989cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    } execstack;
990cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
991441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if only used sections are used.  */
992441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool gc_sections;
993441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
994441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Array to determine final index of symbol.  */
995441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word *dblindirect;
996441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
997441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Section group handling.  */
998441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scngroup
999441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
1000441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    Elf32_Word outscnidx;
1001441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    int nscns;
1002441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct member
1003441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
1004441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct scnhead *scn;
1005441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct member *next;
1006441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    } *member;
1007441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct Ebl_Strent *nameent;
1008441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct symbol *symbol;
1009441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    struct scngroup *next;
1010441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  } *groups;
1011441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1012441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if the output file needs a .got section.  */
1013441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool need_got;
1014441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of relocations for GOT section caused.  */
1015441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t nrel_got;
1016441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1017441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Number of entries needed in the .dynamic section.  */
1018441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int ndynamic;
1019441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* To keep track of added entries.  */
1020441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int ndynamic_filled;
1021441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Index for the dynamic section.  */
1022441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dynamicscnidx;
1023441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1024441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Flags set in the DT_FLAGS word.  */
1025441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dt_flags;
1026441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Flags set in the DT_FLAGS_1 word.  */
1027441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dt_flags_1;
1028441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Flags set in the DT_FEATURE_1 word.  */
1029441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf32_Word dt_feature_1;
1030441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1031441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Lazy-loading state for dependencies.  */
1032441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool lazyload;
1033441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1034cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* True if an .eh_frame_hdr section should be generated.  */
1035cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool eh_frame_hdr;
1036cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
1037cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* What hash style to generate.  */
1038cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  enum
1039cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
1040cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      hash_style_none = 0,
1041cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      hash_style_sysv = 1,
1042cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define GENERATE_SYSV_HASH ((ld_state.hash_style & hash_style_sysv) != 0)
1043cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      hash_style_gnu = 2
1044cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define GENERATE_GNU_HASH ((ld_state.hash_style & hash_style_gnu) != 0)
1045cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    }
1046cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  hash_style;
1047441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1048441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1049441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* True if in executables all global symbols should be exported in
1050441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     the dynamic symbol table.  */
1051441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool export_all_dynamic;
1052441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1053cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Build-ID style.  NULL is none.  */
1054cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const char *build_id;
1055cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf32_Word buildidscnidx;
1056cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
1057441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If DSO is generated, this is the SONAME.  */
1058441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *soname;
1059441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1060441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* List of all relocation sections.  */
1061441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct scninfo *rellist;
1062441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Total size of non-PLT relocations.  */
1063441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t relsize_total;
1064441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1065441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Record for the GOT symbol, if known.  */
1066441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *got_symbol;
1067441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Record for the dynamic section symbol, if known.  */
1068441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *dyn_symbol;
1069441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1070441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Obstack used for small objects which will not be deleted.  */
1071441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct obstack smem;
1072441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project};
1073441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1074441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1075441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The interface to the scanner.  */
1076441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1077441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Parser entry point.  */
1078441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int ldparse (void);
1079441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1080441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The input file.  */
1081441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern FILE *ldin;
1082441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1083441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Name of the input file.  */
1084441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ldin_fname;
1085441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1086441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Current line number.  Must be reset for a new file.  */
1087441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int ldlineno;
1088441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1089441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* If nonzero we are currently parsing a version script.  */
1090441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int ld_scan_version_script;
1091441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1092441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Flags defined in ld.c.  */
1093441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int verbose;
1094441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int conserve_memory;
1095441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1096441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1097441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Linker state.  This contains all global information.  */
1098441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct ld_state ld_state;
1099441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Generic ld helper functions.  */
1102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Append a new directory to search libraries in.  */
1104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ld_new_searchdir (const char *dir);
1105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Append a new file to the list of input files.  */
1107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct usedfiles *ld_new_inputfile (const char *fname,
1108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					   enum file_type type);
1109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* These are the generic implementations for the callbacks used by ld.  */
1112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Initialize state object.  This callback function is called after the
1114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   parameters are parsed but before any file is searched for.  */
1115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int ld_prepare_state (const char *emulation);
1116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Function to determine whether an object will be dynamically linked.  */
1119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool dynamically_linked_p (void);
1120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Helper functions for the architecture specific code.  */
1122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Checked whether the symbol is undefined and referenced from a DSO.  */
1124cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool linked_from_dso_p (struct scninfo *scninfo, size_t symidx);
1125cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifdef __GNUC_STDC_INLINE__
1126cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng__attribute__ ((__gnu_inline__))
1127cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
1128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern inline bool
1129cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chenglinked_from_dso_p (struct scninfo *scninfo, size_t symidx)
1130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
1131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct usedfiles *file = scninfo->fileinfo;
1132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If this symbol is not undefined in this file it cannot come from
1134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     a DSO.  */
1135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (symidx < file->nlocalsymbols)
1136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    return false;
1137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct symbol *sym = file->symref[symidx];
1139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return sym->defined && sym->in_dso;
1141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
1142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
1143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif	/* ld.h */
1144