1/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 Red Hat, Inc.
2   This file is part of Red Hat elfutils.
3   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
4
5   Red Hat elfutils is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by the
7   Free Software Foundation; version 2 of the License.
8
9   Red Hat elfutils is distributed in the hope that it will be useful, but
10   WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   General Public License for more details.
13
14   You should have received a copy of the GNU General Public License along
15   with Red Hat elfutils; if not, write to the Free Software Foundation,
16   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17
18   Red Hat elfutils is an included package of the Open Invention Network.
19   An included package of the Open Invention Network is a package for which
20   Open Invention Network licensees cross-license their patents.  No patent
21   license is granted, either expressly or impliedly, by designation as an
22   included package.  Should you wish to participate in the Open Invention
23   Network licensing program, please visit www.openinventionnetwork.com
24   <http://www.openinventionnetwork.com>.  */
25
26#ifdef HAVE_CONFIG_H
27# include <config.h>
28#endif
29
30#include <assert.h>
31#include <error.h>
32#include <libintl.h>
33#include <stdlib.h>
34#include <string.h>
35
36// XXX For debugging
37#include <stdio.h>
38
39#include <system.h>
40#include "ld.h"
41#include "list.h"
42/* x86 is little endian.  */
43#define UNALIGNED_ACCESS_CLASS LITTLE_ENDIAN
44#include "unaligned.h"
45#include "xelf.h"
46
47
48/* The old callbacks.  */
49static int (*old_open_outfile) (struct ld_state *, int, int, int);
50
51
52static int
53elf_i386_open_outfile (struct ld_state *statep,
54		       int machine __attribute__ ((unused)),
55		       int klass __attribute__ ((unused)),
56		       int data __attribute__ ((unused)))
57{
58  /* This backend only handles 32-bit object files.  */
59  /* XXX For now just use the generic backend.  */
60  return old_open_outfile (statep, EM_386, ELFCLASS32, ELFDATA2LSB);
61}
62
63
64/* Process relocations for the output in a relocatable file.  This
65   only means adjusting offset and symbol indices.  */
66static void
67elf_i386_relocate_section (struct ld_state *statep __attribute__ ((unused)),
68			   Elf_Scn *outscn, struct scninfo *firstp,
69			   const Elf32_Word *dblindirect)
70{
71  struct scninfo *runp;
72  Elf_Data *data;
73
74  /* Iterate over all the input sections.  Appropriate data buffers in the
75     output sections were already created.  */
76  runp = firstp;
77  data = NULL;
78  do
79    {
80      Elf_Data *reltgtdata;
81      Elf_Data *insymdata;
82      Elf_Data *inxndxdata = NULL;
83      size_t maxcnt;
84      size_t cnt;
85      const Elf32_Word *symindirect;
86      struct symbol **symref;
87      struct usedfiles *file = runp->fileinfo;
88      XElf_Shdr *shdr = &SCNINFO_SHDR (runp->shdr);
89
90      /* Get the output section data buffer for this input section.  */
91      data = elf_getdata (outscn, data);
92      assert (data != NULL);
93
94      /* Get the data for section in the input file this relocation
95	 section is relocating.  Since these buffers are reused in the
96	 output modifying these buffers has the correct result.  */
97      reltgtdata = elf_getdata (file->scninfo[shdr->sh_info].scn, NULL);
98
99      /* Get the data for the input section symbol table for this
100	 relocation section.  */
101      insymdata = elf_getdata (file->scninfo[shdr->sh_link].scn, NULL);
102      assert (insymdata != NULL);
103
104      /* And the extended section index table.  */
105      inxndxdata = runp->fileinfo->xndxdata;
106
107      /* Number of relocations.  */
108      maxcnt = shdr->sh_size / shdr->sh_entsize;
109
110      /* Array directing local symbol table offsets to output symbol
111	 table offsets.  */
112      symindirect = file->symindirect;
113
114      /* References to the symbol records.  */
115      symref = file->symref;
116
117      /* Iterate over all the relocations in the section.  */
118      for (cnt = 0; cnt < maxcnt; ++cnt)
119	{
120	  XElf_Rel_vardef (rel);
121	  Elf32_Word si;
122	  XElf_Sym_vardef (sym);
123	  Elf32_Word xndx;
124
125	  /* Get the relocation data itself.  x86 uses Rel
126	     relocations.  In case we have to handle Rela as well the
127	     whole loop probably should be duplicated.  */
128	  xelf_getrel (data, cnt, rel);
129	  assert (rel != NULL);
130
131	  /* Compute the symbol index in the output file.  */
132	  si = symindirect[XELF_R_SYM (rel->r_info)];
133	  if (si == 0)
134	    {
135	      /* This happens if the symbol is locally undefined or
136		 superceded by some other definition.  */
137	      assert (symref[XELF_R_SYM (rel->r_info)] != NULL);
138	      si = symref[XELF_R_SYM (rel->r_info)]->outsymidx;
139	    }
140	  /* Take reordering performed to sort the symbol table into
141	     account.  */
142	  si = dblindirect[si];
143
144	  /* Get the symbol table entry.  */
145	  xelf_getsymshndx (insymdata, inxndxdata, XELF_R_SYM (rel->r_info),
146			    sym, xndx);
147	  if (sym->st_shndx != SHN_XINDEX)
148	    xndx = sym->st_shndx;
149	  assert (xndx < SHN_LORESERVE || xndx > SHN_HIRESERVE);
150
151	  /* We fortunately don't have to do much.  The relocations
152	     mostly get only updates of the offset.  Only for a
153	     relocation referring to a section do we have to do
154	     something.  In this case the reference to the sections
155	     has no direct equivalent since the part the input section
156	     contributes need not start at the same offset as in the
157	     input file.  Therefore we have to adjust the addend which
158	     in the case of Rel relocations is in the target section
159	     itself.  */
160	  if (XELF_ST_TYPE (sym->st_info) == STT_SECTION)
161	    {
162	      /* We expect here only R_386_32 relocations.  */
163	      assert (XELF_R_TYPE (rel->r_info) == R_386_32);
164
165	      /* Avoid writing to the section memory if this is
166		 effectively a no-op since it might save a
167		 copy-on-write operation.  */
168	      Elf32_Word toadd = file->scninfo[xndx].offset;
169	      if (toadd != 0)
170		add_4ubyte_unaligned (reltgtdata->d_buf + rel->r_offset,
171				      toadd);
172	    }
173
174	  /* Adjust the offset for the position of the input section
175	     content in the output section.  */
176	  rel->r_offset += file->scninfo[shdr->sh_info].offset;
177
178	  /* And finally adjust the index of the symbol in the output
179	     symbol table.  */
180	  rel->r_info = XELF_R_INFO (si, XELF_R_TYPE (rel->r_info));
181
182	  /* Store the result.  */
183	  (void) xelf_update_rel (data, cnt, rel);
184	}
185
186      runp = runp->next;
187    }
188  while (runp != firstp);
189}
190
191
192/* Each PLT entry has 16 bytes.  We need one entry as overhead for
193   the code to set up the call into the runtime relocation.  */
194#define PLT_ENTRY_SIZE 16
195
196static void
197elf_i386_initialize_plt (struct ld_state *statep, Elf_Scn *scn)
198{
199  Elf_Data *data;
200  XElf_Shdr_vardef (shdr);
201
202  /* Change the entry size in the section header.  */
203  xelf_getshdr (scn, shdr);
204  assert (shdr != NULL);
205  shdr->sh_entsize = PLT_ENTRY_SIZE;
206  (void) xelf_update_shdr (scn, shdr);
207
208  data = elf_newdata (scn);
209  if (data == NULL)
210    error (EXIT_FAILURE, 0, gettext ("cannot allocate PLT section: %s"),
211	   elf_errmsg (-1));
212
213  /* We need one special PLT entry (performing the jump to the runtime
214     relocation routines) and one for each function we call in a DSO.  */
215  data->d_size = (1 + statep->nplt) * PLT_ENTRY_SIZE;
216  data->d_buf = xcalloc (1, data->d_size);
217  assert (data->d_type == ELF_T_BYTE);
218  data->d_off = 0;
219  data->d_align = 8;
220
221  statep->nplt_used = 1;
222}
223
224
225static void
226elf_i386_initialize_pltrel (struct ld_state *statep, Elf_Scn *scn)
227{
228  Elf_Data *data;
229
230  data = elf_newdata (scn);
231  if (data == NULL)
232    error (EXIT_FAILURE, 0, gettext ("cannot allocate PLTREL section: %s"),
233	   elf_errmsg (-1));
234
235  /* One relocation per PLT entry.  */
236  size_t size = statep->nplt * sizeof (Elf32_Rel);
237  data->d_buf = xcalloc (1, size);
238  data->d_type = ELF_T_REL;
239  data->d_size = size;
240  data->d_align = 4;
241  data->d_off = 0;
242}
243
244
245static void
246elf_i386_initialize_got (struct ld_state *statep, Elf_Scn *scn)
247{
248  /* If we come here we better need a GOT.  */
249  assert (statep->ngot != 0);
250
251  Elf_Data *data = elf_newdata (scn);
252  if (data == NULL)
253    error (EXIT_FAILURE, 0, gettext ("cannot allocate GOT section: %s"),
254	   elf_errmsg (-1));
255
256  /* Just a single word per GOT entry is needed.  */
257  size_t size = statep->ngot * sizeof (Elf32_Addr);
258  data->d_buf = xcalloc (1, size);
259  data->d_size = size;
260  data->d_type = ELF_T_WORD;
261  data->d_off = 0;
262  data->d_align = sizeof (Elf32_Addr);
263}
264
265
266static void
267elf_i386_initialize_gotplt (struct ld_state *statep, Elf_Scn *scn)
268{
269  /* If we come here we better need a PLT.  */
270  assert (statep->nplt != 0);
271
272  Elf_Data *data = elf_newdata (scn);
273  if (data == NULL)
274    error (EXIT_FAILURE, 0, gettext ("cannot allocate GOTPLT section: %s"),
275	   elf_errmsg (-1));
276
277  /* We construct the .got.plt section in pieces.  Here we only add the data
278     structures which are used by the PLT.  This includes three reserved
279     entries at the beginning (the first will contain a pointer to the
280     .dynamic section), and one word for each PLT entry.  */
281  size_t size = (3 + statep->nplt) * sizeof (Elf32_Addr);
282  data->d_buf = xcalloc (1, size);
283  data->d_type = ELF_T_WORD;
284  data->d_size = size;
285  data->d_off = 0;
286  data->d_align = sizeof (Elf32_Addr);
287}
288
289
290/* The first entry in an absolute procedure linkage table looks like
291   this.  See the SVR4 ABI i386 supplement to see how this works.  */
292static const unsigned char elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
293{
294  0xff, 0x35,	/* pushl contents of address */
295  0, 0, 0, 0,	/* replaced with address of .got + 4.  */
296  0xff, 0x25,	/* jmp indirect */
297  0, 0, 0, 0,	/* replaced with address of .got + 8.  */
298  0x0f, 0x0b,	/* ud2a, to prevent further decoding.  */
299  0, 0		/* pad out to 16 bytes.  */
300};
301
302/* Type describing the first PLT entry in non-PIC.  */
303struct plt0_entry
304{
305  /* First a 'push' of the second GOT entry.  */
306  unsigned char push_instr[2];
307  uint32_t gotp4_addr;
308  /* Second, a 'jmp indirect' to the third GOT entry.  */
309  unsigned char jmp_instr[2];
310  uint32_t gotp8_addr;
311  /* Padding.  */
312  unsigned char padding[4];
313} __attribute__ ((packed));
314
315/* The first entry in a PIC procedure linkage table look like this.  */
316static const unsigned char elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
317{
318  0xff, 0xb3, 4, 0, 0, 0,	/* pushl 4(%ebx) */
319  0xff, 0xa3, 8, 0, 0, 0,	/* jmp *8(%ebx) */
320  0x0f, 0x0b,			/* ud2a, to prevent further decoding.  */
321  0, 0				/* pad out to 16 bytes.  */
322};
323
324/* Contents of all but the first PLT entry in executable.  */
325static const unsigned char elf_i386_plt_entry[PLT_ENTRY_SIZE] =
326{
327  0xff, 0x25,   /* jmp indirect */
328  0, 0, 0, 0,   /* replaced with address of this symbol in .got.  */
329  0x68,         /* pushl immediate */
330  0, 0, 0, 0,   /* replaced with offset into relocation table.  */
331  0xe9,         /* jmp relative */
332  0, 0, 0, 0    /* replaced with offset to start of .plt.  */
333};
334
335/* Contents of all but the first PLT entry in DSOs.  */
336static const unsigned char elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
337{
338  0xff, 0xa3,	/* jmp *offset(%ebx) */
339  0, 0, 0, 0,	/* replaced with offset of this symbol in .got.  */
340  0x68,		/* pushl immediate */
341  0, 0, 0, 0,	/* replaced with offset into relocation table.  */
342  0xe9,		/* jmp relative */
343  0, 0, 0, 0	/* replaced with offset to start of .plt.  */
344};
345
346/* Type describing a PLT entry.  */
347struct plt_entry
348{
349  /* The first instruction is 'jmp indirect' or 'jmp *offset(%ebs)'.  */
350  unsigned char jmp_instr[2];
351  uint32_t offset_got;
352  /* The second instruction is 'push immediate'.  */
353  unsigned char push_instr;
354  uint32_t push_imm;
355  /* Finally a 'jmp relative'.  */
356  unsigned char jmp_instr2;
357  uint32_t plt0_offset;
358} __attribute__ ((packed));
359
360
361static void
362elf_i386_finalize_plt (struct ld_state *statep, size_t nsym,
363		       size_t nsym_local, struct symbol **ndxtosym)
364{
365  if (unlikely (statep->nplt + statep->ngot == 0))
366    /* Nothing to be done.  */
367    return;
368
369  Elf_Scn *scn;
370  XElf_Shdr_vardef (shdr);
371  Elf_Data *data;
372  const bool build_dso = statep->file_type == dso_file_type;
373
374  /* Get the address of the .got.plt section.  */
375  scn = elf_getscn (statep->outelf, statep->gotpltscnidx);
376  xelf_getshdr (scn, shdr);
377  data = elf_getdata (scn, NULL);
378  assert (shdr != NULL && data != NULL);
379  /* The address points to the .got.plt section, not the .got section.  */
380  Elf32_Addr gotaddr = shdr->sh_addr;
381
382  /* Now create the initial values for the .got.plt section.  The
383     first word contains the address of the .dynamic section.  The
384     second and third entry are left empty for use by the dynamic
385     linker.  The following entries are pointers to the instructions
386     following the initial jmp instruction in the corresponding PLT
387     entry.  */
388  xelf_getshdr (elf_getscn (statep->outelf, statep->dynamicscnidx), shdr);
389  assert (shdr != NULL);
390  ((Elf32_Word *) data->d_buf)[0] = shdr->sh_addr;
391
392  /* The PLT contains code which a user of a function jumps to.  The first
393     PLT entry is special, so the first used one has the index 1.  */
394  scn = elf_getscn (statep->outelf, statep->pltscnidx);
395  XElf_Shdr_vardef (pltshdr);
396  xelf_getshdr (scn, pltshdr);
397  assert (pltshdr != NULL);
398
399  Elf_Data *dynsymdata = elf_getdata (elf_getscn (statep->outelf,
400						  statep->dynsymscnidx), NULL);
401  assert (dynsymdata != NULL);
402
403  Elf_Data *symdata = NULL;
404  if (statep->symscnidx != 0)
405    {
406      symdata = elf_getdata (elf_getscn (statep->outelf, statep->symscnidx),
407			     NULL);
408      assert (symdata != NULL);
409    }
410
411  /* Create the .plt section.  */
412  scn = elf_getscn (statep->outelf, statep->pltscnidx);
413  Elf_Data *pltdata = elf_getdata (scn, NULL);
414  assert (pltdata != NULL);
415
416  /* Also create the .rel.plt section data.  It simply means relocations
417     addressing the corresponding entry in the .got.plt section.  The
418     section name is misleading.  */
419  scn = elf_getscn (statep->outelf, statep->pltrelscnidx);
420  xelf_getshdr (scn, shdr);
421  Elf_Data *reldata = elf_getdata (scn, NULL);
422  assert (shdr != NULL && reldata != NULL);
423
424  /* Update the sh_link to point to the section being modified.  We
425     point it here (correctly) to the .got.plt section.  Some linkers
426     (e.g., the GNU binutils linker) point to the .plt section.  This
427     is wrong since the .plt section isn't modified even though the
428     name .rel.plt suggests that this is correct.  */
429  shdr->sh_link = statep->dynsymscnidx;
430  shdr->sh_info = statep->gotpltscnidx;
431  (void) xelf_update_shdr (scn, shdr);
432
433  /* Create the first entry of the .plt section.  */
434  assert (pltdata->d_size >= PLT_ENTRY_SIZE);
435  if (build_dso)
436    /* Copy the entry.  It's complete, no relocation needed.  */
437    memcpy (pltdata->d_buf, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
438  else
439    {
440      /* Copy the skeleton.  */
441      memcpy (pltdata->d_buf, elf_i386_plt0_entry, PLT_ENTRY_SIZE);
442
443      /* And fill in the addresses.  */
444      struct plt0_entry *addr = (struct plt0_entry *) pltdata->d_buf;
445      addr->gotp4_addr = target_bswap_32 (gotaddr + 4);
446      addr->gotp8_addr = target_bswap_32 (gotaddr + 8);
447    }
448
449  /* For DSOs we need GOT offsets, otherwise the GOT address.  */
450  Elf32_Addr gotaddr_off = build_dso ? 0 : gotaddr;
451
452  /* Create the remaining entries.  */
453  const unsigned char *plt_template
454    = build_dso ? elf_i386_pic_plt_entry : elf_i386_plt_entry;
455
456  for (size_t idx = nsym_local; idx < nsym; ++idx)
457    {
458      struct symbol *symbol = ndxtosym[idx];
459      if (symbol == NULL || symbol->type != STT_FUNC
460	  || ndxtosym[idx]->outdynsymidx == 0
461	  // XXX is the following test correct?
462	  || ! ndxtosym[idx]->in_dso)
463	continue;
464
465      size_t pltidx = symbol->merge.value;
466
467      assert (pltidx > 0);
468      assert ((3 + pltidx) * sizeof (Elf32_Word) <= data->d_size);
469
470      /* Address in the PLT.  */
471      Elf32_Addr pltentryaddr = (pltshdr->sh_addr + pltidx * PLT_ENTRY_SIZE);
472
473      /* Point the GOT entry at the PLT entry, after the initial jmp.  */
474      ((Elf32_Word *) data->d_buf)[2 + pltidx] = pltentryaddr + 6;
475
476      /* If the symbol is defined, adjust the address.  */
477      if (((Elf32_Sym *) dynsymdata->d_buf)[ndxtosym[idx]->outdynsymidx].st_shndx != SHN_UNDEF)
478	{
479	  /* The value of the symbol is the address of the corresponding PLT
480	     entry.  Store the address, also for the normal symbol table if
481	     this is necessary.  */
482	  ((Elf32_Sym *) dynsymdata->d_buf)[pltidx].st_value = pltentryaddr;
483
484	  if (symdata != NULL)
485 {
486   assert(nsym - statep->nplt + (pltidx - 1) == idx);
487	    ((Elf32_Sym *) symdata->d_buf)[nsym - statep->nplt
488					   + (pltidx - 1)].st_value
489	      = pltentryaddr;
490 }
491	}
492
493      /* Copy the PLT entry template.  */
494      assert (pltdata->d_size >= (1 + pltidx) * PLT_ENTRY_SIZE);
495      struct plt_entry *addr = (struct plt_entry *) ((char *) pltdata->d_buf
496						     + (pltidx
497							* PLT_ENTRY_SIZE));
498      memcpy (addr, plt_template, PLT_ENTRY_SIZE);
499
500      /* And once more, fill in the addresses.  First the address of
501	 this symbol in .got.  */
502      addr->offset_got = target_bswap_32 (gotaddr_off
503					  + (2 + pltidx) * sizeof (Elf32_Addr));
504      /* Offset into relocation table.  */
505      addr->push_imm = target_bswap_32 ((pltidx - 1) * sizeof (Elf32_Rel));
506      /* Offset to start of .plt.  */
507      addr->plt0_offset = target_bswap_32 (-(1 + pltidx) * PLT_ENTRY_SIZE);
508
509
510      XElf_Rel_vardef (rel);
511      assert (pltidx * sizeof (Elf32_Rel) <= reldata->d_size);
512      xelf_getrel_ptr (reldata, pltidx - 1, rel);
513      rel->r_offset = gotaddr + (2 + pltidx) * sizeof (Elf32_Addr);
514      /* The symbol table entries for the functions from DSOs are at
515	 the beginning of the symbol table.  */
516      rel->r_info = XELF_R_INFO (ndxtosym[idx]->outdynsymidx, R_386_JMP_SLOT);
517      (void) xelf_update_rel (reldata, pltidx - 1, rel);
518    }
519}
520
521
522static int
523elf_i386_rel_type (struct ld_state *statep __attribute__ ((__unused__)))
524{
525  /* ELF/i386 uses REL.  */
526  return DT_REL;
527}
528
529
530static void
531elf_i386_count_relocations (struct ld_state *statep, struct scninfo *scninfo)
532{
533  /* We go through the list of input sections and count those relocations
534     which are not handled by the linker.  At the same time we have to
535     see how many GOT entries we need and how much .bss space is needed
536     for copy relocations.  */
537  Elf_Data *data = elf_getdata (scninfo->scn, NULL);
538  XElf_Shdr *shdr = &SCNINFO_SHDR (scninfo->shdr);
539  size_t maxcnt = shdr->sh_size / shdr->sh_entsize;
540  size_t relsize = 0;
541  size_t cnt;
542  struct symbol *sym;
543
544  assert (shdr->sh_type == SHT_REL);
545
546  for (cnt = 0; cnt < maxcnt; ++cnt)
547    {
548      XElf_Rel_vardef (rel);
549
550      xelf_getrel (data, cnt, rel);
551      /* XXX Should we complain about failing accesses?  */
552      if (rel != NULL)
553	{
554	  Elf32_Word r_sym = XELF_R_SYM (rel->r_info);
555
556	  /* Symbols in COMDAT group sections which are discarded do
557	     not have to be relocated.  */
558	  if (r_sym >= scninfo->fileinfo->nlocalsymbols
559	      && unlikely (scninfo->fileinfo->symref[r_sym] == NULL))
560	    continue;
561
562	  switch (XELF_R_TYPE (rel->r_info))
563	    {
564	    case R_386_GOT32:
565	      if (! scninfo->fileinfo->symref[r_sym]->defined
566		  || scninfo->fileinfo->symref[r_sym]->in_dso
567		  || statep->file_type == dso_file_type)
568		{
569		  relsize += sizeof (Elf32_Rel);
570		  ++statep->nrel_got;
571		}
572
573	      /* Even if this relocation is not emitted in the output
574		 file it requires a GOT entry.  */
575	      ++statep->ngot;
576
577	      /* FALLTHROUGH */
578
579	    case R_386_GOTOFF:
580	    case R_386_GOTPC:
581	      statep->need_got = true;
582	      break;
583
584	    case R_386_32:
585	    case R_386_PC32:
586	      /* These relocations cause text relocations in DSOs.  */
587	      if (linked_from_dso_p (scninfo, r_sym))
588		{
589		  if (statep->file_type == dso_file_type)
590		    {
591		      relsize += sizeof (Elf32_Rel);
592		      // XXX Do we have to check whether the target
593		      // XXX section is read-only first?
594		      statep->dt_flags |= DF_TEXTREL;
595		    }
596		  else
597		    {
598		      /* Non-function objects from a DSO need to get a
599			 copy relocation.  */
600		      sym = scninfo->fileinfo->symref[r_sym];
601
602		      /* Only do this if we have not requested a copy
603			 relocation already.  */
604		      if (unlikely (sym->type != STT_FUNC) && ! sym->need_copy)
605			{
606			  sym->need_copy = 1;
607			  ++statep->ncopy;
608			  relsize += sizeof (Elf32_Rel);
609			}
610		    }
611		}
612	      else if (statep->file_type == dso_file_type
613		       && XELF_R_TYPE (rel->r_info) == R_386_32)
614		relsize += sizeof (Elf32_Rel);
615
616	      break;
617
618	    case R_386_PLT32:
619	      /* We might need a PLT entry.  But we cannot say for sure
620		 here since one of the symbols might turn up being
621		 defined in the executable (if we create such a thing).
622		 If a DSO is created we still might use a local
623		 definition.
624
625		 If the symbol is not defined and we are not creating
626		 a statically linked binary, then we need in any case
627		 a PLT entry.  */
628	      if (! scninfo->fileinfo->symref[r_sym]->defined
629		  && !statep->statically)
630		{
631		  sym = scninfo->fileinfo->symref[r_sym];
632		  sym->type = STT_FUNC;
633		  sym->in_dso = 1;
634		  sym->defined = 1;
635
636		  /* Remove from the list of unresolved symbols.  */
637		  --statep->nunresolved;
638		  if (! sym->weak)
639		    --statep->nunresolved_nonweak;
640		  CDBL_LIST_DEL (statep->unresolved, sym);
641
642		  /* Add to the list of symbols we expect from a DSO.  */
643		  ++statep->nplt;
644		  ++statep->nfrom_dso;
645		  CDBL_LIST_ADD_REAR (statep->from_dso, sym);
646		}
647	      break;
648
649	    case R_386_TLS_LDO_32:
650	      if (statep->file_type != executable_file_type)
651		abort ();
652	      /* We do not need a relocation in the output file.  */
653	      break;
654
655	    case R_386_TLS_LE:
656	      /* We never need a relocation in the output file.  */
657	      break;
658
659	    case R_386_TLS_IE:
660	      if (statep->file_type == dso_file_type)
661		error (EXIT_FAILURE, 0, gettext ("initial-executable TLS relocation cannot be used "));
662	      if (!scninfo->fileinfo->symref[r_sym]->defined
663		  || scninfo->fileinfo->symref[r_sym]->in_dso)
664		{
665		  abort ();
666		}
667	      break;
668
669	    case R_386_TLS_GD:
670	      if (statep->file_type != executable_file_type
671		  || !scninfo->fileinfo->symref[r_sym]->defined
672		  || scninfo->fileinfo->symref[r_sym]->in_dso)
673		{
674		  abort ();
675		}
676	      break;
677
678	    case R_386_TLS_GOTIE:
679	    case R_386_TLS_LDM:
680	    case R_386_TLS_GD_32:
681	    case R_386_TLS_GD_PUSH:
682	    case R_386_TLS_GD_CALL:
683	    case R_386_TLS_GD_POP:
684	    case R_386_TLS_LDM_32:
685	    case R_386_TLS_LDM_PUSH:
686	    case R_386_TLS_LDM_CALL:
687	    case R_386_TLS_LDM_POP:
688	    case R_386_TLS_IE_32:
689	    case R_386_TLS_LE_32:
690	      /* XXX */
691	      abort ();
692	      break;
693
694	    case R_386_NONE:
695	      /* Nothing to be done.  */
696	      break;
697
698	      /* These relocation should never be generated by an
699		 assembler.  */
700	    case R_386_COPY:
701	    case R_386_GLOB_DAT:
702	    case R_386_JMP_SLOT:
703	    case R_386_RELATIVE:
704	    case R_386_TLS_DTPMOD32:
705	    case R_386_TLS_DTPOFF32:
706	    case R_386_TLS_TPOFF32:
707	      /* Unknown relocation.  */
708	    default:
709	      abort ();
710	    }
711	}
712    }
713
714  scninfo->relsize = relsize;
715}
716
717
718static void
719elf_i386_create_relocations (struct ld_state *statep,
720			     const Elf32_Word *dblindirect __attribute__ ((unused)))
721{
722  /* Get the address of the got section.  */
723  Elf_Scn *pltscn = elf_getscn (statep->outelf, statep->pltscnidx);
724  Elf32_Shdr *shdr = elf32_getshdr (pltscn);
725  assert (shdr != NULL);
726  Elf32_Addr pltaddr = shdr->sh_addr;
727
728  Elf_Scn *gotscn = elf_getscn (statep->outelf, statep->gotscnidx);
729  // XXX Adjust the address, if necessary, for relro
730  Elf_Data *gotdata = NULL;
731  if (statep->need_got)
732    {
733      gotdata = elf_getdata (gotscn, NULL);
734      assert (gotdata != NULL);
735    }
736
737  Elf_Scn *gotpltscn = elf_getscn (statep->outelf, statep->gotpltscnidx);
738  shdr = elf32_getshdr (gotpltscn);
739  assert (shdr != NULL);
740  Elf32_Addr gotaddr = shdr->sh_addr;
741
742  Elf_Scn *reldynscn = elf_getscn (statep->outelf, statep->reldynscnidx);
743  Elf_Data *reldyndata = elf_getdata (reldynscn, NULL);
744  assert (reldyndata != NULL);
745
746  size_t nreldyn = 0;
747  size_t ngotconst = statep->nrel_got;
748
749  struct scninfo *first = statep->rellist->next;
750  struct scninfo *runp = first;
751  do
752    {
753      XElf_Shdr *rshdr = &SCNINFO_SHDR (runp->shdr);
754      Elf_Data *reldata = elf_getdata (runp->scn, NULL);
755      int nrels = rshdr->sh_size / rshdr->sh_entsize;
756
757      /* We will need the following values a couple of times.  Help
758	 the compiler and improve readability.  */
759      struct symbol **symref = runp->fileinfo->symref;
760      struct scninfo *scninfo = runp->fileinfo->scninfo;
761
762      /* This is the offset of the input section we are looking at in
763	 the output file.  */
764      XElf_Addr inscnoffset = scninfo[rshdr->sh_info].offset;
765
766      /* The target section.  We use the data from the input file.  */
767      Elf_Data *data = elf_getdata (scninfo[rshdr->sh_info].scn, NULL);
768
769      /* We cannot handle relocations against merge-able sections.  */
770      assert ((SCNINFO_SHDR (scninfo[rshdr->sh_link].shdr).sh_flags
771	       & SHF_MERGE) == 0);
772
773      /* Cache the access to the symbol table data.  */
774      Elf_Data *symdata = elf_getdata (scninfo[rshdr->sh_link].scn, NULL);
775
776      for (int cnt = 0; cnt < nrels; ++cnt)
777	{
778	  XElf_Rel_vardef (rel);
779	  XElf_Rel *rel2;
780	  xelf_getrel (reldata, cnt, rel);
781	  assert (rel != NULL);
782	  XElf_Addr reladdr = inscnoffset + rel->r_offset;
783	  XElf_Addr value;
784
785	  size_t idx = XELF_R_SYM (rel->r_info);
786	  if (idx < runp->fileinfo->nlocalsymbols)
787	    {
788	      XElf_Sym_vardef (sym);
789	      xelf_getsym (symdata, idx, sym);
790
791	      /* The value only depends on the position of the referenced
792		 section in the output file and the addend.  */
793	      value = scninfo[sym->st_shndx].offset + sym->st_value;
794	    }
795	  else
796	    {
797	      if (symref[idx] == NULL)
798		/* Symbol in ignored COMDAT group section.  */
799		continue;
800
801	      value = symref[idx]->merge.value;
802	      if (symref[idx]->in_dso)
803		{
804		  /* MERGE.VALUE contains the PLT index.  If this is not for
805		     a function the actual value will be computed later.  */
806		  assert (value != 0 || symref[idx]->type != STT_FUNC);
807		  value = pltaddr + value * PLT_ENTRY_SIZE;
808		}
809	    }
810
811	  /* Address of the relocated memory in the data buffer.  */
812	  unsigned char *relloc = (unsigned char *) data->d_buf + rel->r_offset;
813
814	  uint32_t thisgotidx;
815	  switch (XELF_R_TYPE (rel->r_info))
816	    {
817	      /* These three cases can be handled together since the
818		 symbol associated with the R_386_GOTPC relocation is
819		 _GLOBAL_OFFSET_TABLE_ which has a value corresponding
820		 to the address of the GOT and the address of the PLT
821		 entry required for R_386_PLT32 is computed above.  */
822	    case R_386_PC32:
823	    case R_386_GOTPC:
824	    case R_386_PLT32:
825	      value -= reladdr;
826	      /* FALLTHROUGH */
827
828	    case R_386_32:
829	      if (linked_from_dso_p (scninfo, idx)
830		  && statep->file_type != dso_file_type
831		  && symref[idx]->type != STT_FUNC)
832		{
833		  value = (ld_state.copy_section->offset
834			   + symref[idx]->merge.value);
835
836		  if (unlikely (symref[idx]->need_copy))
837		    {
838		      /* Add a relocation to initialize the GOT entry.  */
839		      assert (symref[idx]->outdynsymidx != 0);
840#if NATIVE_ELF != 0
841		      xelf_getrel_ptr (reldyndata, nreldyn, rel2);
842#else
843		      rel2 = &rel_mem;
844#endif
845		      rel2->r_offset = value;
846		      rel2->r_info
847			= XELF_R_INFO (symref[idx]->outdynsymidx, R_386_COPY);
848		      (void) xelf_update_rel (reldyndata, nreldyn, rel2);
849		      ++nreldyn;
850		      assert (nreldyn <= statep->nrel_got);
851
852		      /* Update the symbol table record for the new
853			 address.  */
854		      Elf32_Word symidx = symref[idx]->outdynsymidx;
855		      Elf_Scn *symscn = elf_getscn (statep->outelf,
856						    statep->dynsymscnidx);
857		      Elf_Data *outsymdata = elf_getdata (symscn, NULL);
858		      assert (outsymdata != NULL);
859		      XElf_Sym_vardef (sym);
860		      xelf_getsym (outsymdata, symidx, sym);
861		      sym->st_value = value;
862		      sym->st_shndx = statep->copy_section->outscnndx;
863		      (void) xelf_update_sym (outsymdata, symidx, sym);
864
865		      symidx = symref[idx]->outsymidx;
866		      if (symidx != 0)
867			{
868			  symidx = statep->dblindirect[symidx];
869			  symscn = elf_getscn (statep->outelf,
870					       statep->symscnidx);
871			  outsymdata = elf_getdata (symscn, NULL);
872			  assert (outsymdata != NULL);
873			  xelf_getsym (outsymdata, symidx, sym);
874			  sym->st_value = value;
875			  sym->st_shndx = statep->copy_section->outscnndx;
876			  (void) xelf_update_sym (outsymdata, symidx, sym);
877			}
878
879		      /* Remember that we set up the copy relocation.  */
880		      symref[idx]->need_copy = 0;
881		    }
882		}
883	      else if (statep->file_type == dso_file_type
884		       && XELF_R_TYPE (rel->r_info) == R_386_32)
885		{
886#if NATIVE_ELF != 0
887		  xelf_getrel_ptr (reldyndata, nreldyn, rel2);
888#else
889		  rel2 = &rel_mem;
890#endif
891		  rel2->r_offset = value;
892
893		  /* For symbols we do not export we generate a relative
894		     relocation.  */
895		  if (idx < SCNINFO_SHDR (scninfo[rshdr->sh_link].shdr).sh_info
896		      || symref[idx]->outdynsymidx == 0)
897		    rel2->r_info = XELF_R_INFO (0, R_386_RELATIVE);
898		  else
899		    rel2->r_info
900		      = XELF_R_INFO (symref[idx]->outdynsymidx, R_386_32);
901		  (void) xelf_update_rel (reldyndata, nreldyn, rel2);
902		  ++nreldyn;
903		  assert (nreldyn <= statep->nrel_got);
904
905		  value = 0;
906		}
907	      add_4ubyte_unaligned (relloc, value);
908	      break;
909
910	    case R_386_GOT32:
911	      if (! symref[idx]->defined || symref[idx]->in_dso)
912		{
913		  thisgotidx = nreldyn++;
914		  assert (thisgotidx < statep->nrel_got);
915
916		  /* Add a relocation to initialize the GOT entry.  */
917#if NATIVE_ELF != 0
918		  xelf_getrel_ptr (reldyndata, thisgotidx, rel2);
919#else
920		  rel2 = &rel_mem;
921#endif
922		  rel2->r_offset = gotaddr + ((thisgotidx - statep->ngot)
923					      * sizeof (Elf32_Addr));
924		  rel2->r_info
925		    = XELF_R_INFO (symref[idx]->outdynsymidx, R_386_GLOB_DAT);
926		  (void) xelf_update_rel (reldyndata, thisgotidx, rel2);
927		}
928	      else if (statep->file_type != dso_file_type)
929		{
930		  thisgotidx = ngotconst++;
931		  assert (thisgotidx < statep->ngot);
932
933		  /* We have to use a GOT since the generated code
934		     requires it but we know the address and therefore
935		     do not need a relocation.  */
936		  ((uint32_t *) gotdata->d_buf)[thisgotidx] = value;
937		}
938	      else
939		{
940		  thisgotidx = nreldyn++;
941		  assert (thisgotidx < statep->nrel_got);
942
943		  // XXX generate a relative relocation.
944		  abort ();
945		}
946
947	      store_4ubyte_unaligned (relloc,
948				      (thisgotidx - statep->ngot)
949				      * sizeof (Elf32_Addr));
950	      break;
951
952	    case R_386_GOTOFF:
953	      add_4ubyte_unaligned (relloc, value - gotaddr);
954	      break;
955
956	    case R_386_TLS_LE:
957	      value = symref[idx]->merge.value - ld_state.tls_tcb;
958	      store_4ubyte_unaligned (relloc, value);
959	      break;
960
961	    case R_386_TLS_IE:
962	      if (symref[idx]->defined && !symref[idx]->in_dso)
963		{
964		  /* The symbol is defined in the executable.
965		     Perform the IE->LE optimization.
966		     There are multiple versions, though.
967
968		     First version: mov ADDR,REG.  */
969		  if (relloc[-2] == 0x8b
970		      && ((relloc[-1] & 0xc7) == 0x05))
971		    {
972		      relloc[-2] = 0xc7;
973		      relloc[-1] = 0xc0 | ((relloc[-1] >> 3) & 7);
974		      store_4ubyte_unaligned (relloc, (symref[idx]->merge.value
975						       - ld_state.tls_tcb));
976		    }
977		  else
978		    {
979		      abort ();
980		    }
981		}
982	      else
983		{
984		  abort ();
985		}
986	      break;
987
988	    case R_386_TLS_LDO_32:
989	      value = symref[idx]->merge.value - ld_state.tls_start;
990	      store_4ubyte_unaligned (relloc, value);
991	      break;
992
993	    case R_386_TLS_GD:
994	      if (ld_state.file_type == executable_file_type)
995		{
996		  if (symref[idx]->defined && !symref[idx]->in_dso)
997		    {
998		      /* The symbol is defined in the executable.
999			 Perform the GD->LE optimization.  */
1000		      static const char gd_to_le[] =
1001			{
1002			  /* mov %gs:0x0,%eax */
1003			  0x65, 0xa1, 0x00, 0x00, 0x00, 0x00,
1004			  /* sub $OFFSET,%eax */
1005			  0x81, 0xe8
1006			};
1007#ifndef NDEBUG
1008		      static const char gd_text[] =
1009			{
1010			  /* lea 0x0(,%ebx,1),%eax */
1011			  0x8d, 0x04, 0x1d, 0x00, 0x00, 0x00, 0x00,
1012			  /* call ___tls_get_addr */
1013			  0xe8
1014			};
1015		      assert (memcmp (relloc - 3, gd_text, sizeof (gd_text))
1016			      == 0);
1017#endif
1018		      relloc = mempcpy (relloc - 3, gd_to_le,
1019					sizeof (gd_to_le));
1020		      value = ld_state.tls_tcb- symref[idx]->merge.value;
1021		      store_4ubyte_unaligned (relloc, value);
1022
1023		      /* We have to skip over the next relocation which is
1024			 the matching R_i386_PLT32 for __tls_get_addr.  */
1025		      ++cnt;
1026#ifndef NDEBUG
1027		      assert (cnt < nrels);
1028		      XElf_Off old_offset = rel->r_offset;
1029		      xelf_getrel (reldata, cnt, rel);
1030		      assert (rel != NULL);
1031		      assert (XELF_R_TYPE (rel->r_info) == R_386_PLT32);
1032		      idx = XELF_R_SYM (rel->r_info);
1033		      assert (strcmp (symref[idx]->name, "___tls_get_addr")
1034			      == 0);
1035		      assert (old_offset + 5 == rel->r_offset);
1036#endif
1037
1038		      break;
1039		    }
1040		}
1041	      abort ();
1042	      break;
1043
1044	    case R_386_32PLT:
1045	    case R_386_TLS_TPOFF:
1046	    case R_386_TLS_GOTIE:
1047	    case R_386_TLS_LDM:
1048	    case R_386_16:
1049	    case R_386_PC16:
1050	    case R_386_8:
1051	    case R_386_PC8:
1052	    case R_386_TLS_GD_32:
1053	    case R_386_TLS_GD_PUSH:
1054	    case R_386_TLS_GD_CALL:
1055	    case R_386_TLS_GD_POP:
1056	    case R_386_TLS_LDM_32:
1057	    case R_386_TLS_LDM_PUSH:
1058	    case R_386_TLS_LDM_CALL:
1059	    case R_386_TLS_LDM_POP:
1060	    case R_386_TLS_IE_32:
1061	    case R_386_TLS_LE_32:
1062	      // XXX For now fall through
1063	      break;
1064
1065	    case R_386_NONE:
1066	      /* Nothing to do.  */
1067	      break;
1068
1069	    case R_386_COPY:
1070	    case R_386_JMP_SLOT:
1071	    case R_386_RELATIVE:
1072	    case R_386_GLOB_DAT:
1073	    case R_386_TLS_DTPMOD32:
1074	    case R_386_TLS_DTPOFF32:
1075	    case R_386_TLS_TPOFF32:
1076	    default:
1077	      /* Should not happen.  */
1078	      abort ();
1079	    }
1080	}
1081    }
1082  while ((runp = runp->next) != first);
1083}
1084
1085
1086int
1087elf_i386_ld_init (struct ld_state *statep)
1088{
1089  /* We have a few callbacks available.  */
1090  old_open_outfile = statep->callbacks.open_outfile;
1091  statep->callbacks.open_outfile = elf_i386_open_outfile;
1092
1093  statep->callbacks.relocate_section  = elf_i386_relocate_section;
1094
1095  statep->callbacks.initialize_plt = elf_i386_initialize_plt;
1096  statep->callbacks.initialize_pltrel = elf_i386_initialize_pltrel;
1097
1098  statep->callbacks.initialize_got = elf_i386_initialize_got;
1099  statep->callbacks.initialize_gotplt = elf_i386_initialize_gotplt;
1100
1101  statep->callbacks.finalize_plt = elf_i386_finalize_plt;
1102
1103  statep->callbacks.rel_type = elf_i386_rel_type;
1104
1105  statep->callbacks.count_relocations = elf_i386_count_relocations;
1106
1107  statep->callbacks.create_relocations = elf_i386_create_relocations;
1108
1109  return 0;
1110}
1111