Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/elf32-wasm32.c
Line
Count
Source (jump to first uncovered line)
1
/* 32-bit ELF for the WebAssembly target
2
   Copyright (C) 2017-2025 Free Software Foundation, Inc.
3
4
   This file is part of BFD, the Binary File Descriptor library.
5
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor,
19
   Boston, MA 02110-1301, USA.  */
20
21
#include "sysdep.h"
22
#include "bfd.h"
23
#include "libbfd.h"
24
#include "elf-bfd.h"
25
#include "libiberty.h"
26
#include "elf/wasm32.h"
27
28
static reloc_howto_type elf32_wasm32_howto_table[] =
29
{
30
  HOWTO (R_WASM32_NONE,   /* type */
31
   0,     /* rightshift */
32
   0,     /* size */
33
   0,     /* bitsize */
34
   false,     /* pc_relative */
35
   0,     /* bitpos */
36
   complain_overflow_dont,/* complain_on_overflow */
37
   bfd_elf_generic_reloc, /* special_function */
38
   "R_WASM32_NONE", /* name */
39
   false,     /* partial_inplace */
40
   0,     /* src_mask */
41
   0,     /* dst_mask */
42
   false),    /* pcrel_offset */
43
44
  /* 32 bit absolute */
45
  HOWTO (R_WASM32_32,   /* type */
46
   0,     /* rightshift */
47
   4,     /* size */
48
   32,      /* bitsize */
49
   false,     /* pc_relative */
50
   0,     /* bitpos */
51
   complain_overflow_bitfield,/* complain_on_overflow */
52
   bfd_elf_generic_reloc, /* special_function */
53
   "R_WASM32_32", /* name */
54
   false,     /* partial_inplace */
55
   0xffffffff,    /* src_mask */
56
   0xffffffff,    /* dst_mask */
57
   false),    /* pcrel_offset */
58
};
59
60
/* Look up the relocation CODE.  */
61
62
static reloc_howto_type *
63
elf32_wasm32_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
64
        bfd_reloc_code_real_type code)
65
0
{
66
0
  switch (code)
67
0
    {
68
0
    case BFD_RELOC_NONE:
69
0
      return &elf32_wasm32_howto_table[R_WASM32_NONE];
70
0
    case BFD_RELOC_32:
71
0
      return &elf32_wasm32_howto_table[R_WASM32_32];
72
0
    default:
73
0
      break;
74
0
    }
75
76
0
  return NULL;
77
0
}
78
79
/* Look up the relocation R_NAME.  */
80
81
static reloc_howto_type *
82
elf32_wasm32_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
83
        const char *r_name)
84
0
{
85
0
  unsigned int i;
86
87
0
  for (i = 0; i < ARRAY_SIZE (elf32_wasm32_howto_table); i++)
88
0
    if (elf32_wasm32_howto_table[i].name != NULL
89
0
  && strcasecmp (elf32_wasm32_howto_table[i].name, r_name) == 0)
90
0
      return &elf32_wasm32_howto_table[i];
91
92
0
  return NULL;
93
0
}
94
95
/* Look up the relocation R_TYPE.  */
96
97
static reloc_howto_type *
98
elf32_wasm32_rtype_to_howto (bfd *abfd, unsigned r_type)
99
0
{
100
0
  unsigned int i = r_type;
101
102
0
  if (i >= ARRAY_SIZE (elf32_wasm32_howto_table))
103
0
    {
104
      /* xgettext:c-format */
105
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
106
0
        abfd, r_type);
107
0
      bfd_set_error (bfd_error_bad_value);
108
0
      return NULL;
109
0
    }
110
111
0
  if (elf32_wasm32_howto_table[i].type != r_type)
112
0
    return NULL;
113
114
0
  return elf32_wasm32_howto_table + i;
115
0
}
116
117
/* Translate the ELF-internal relocation RELA into CACHE_PTR.  */
118
119
static bool
120
elf32_wasm32_info_to_howto_rela (bfd *abfd,
121
        arelent *cache_ptr,
122
        Elf_Internal_Rela *dst)
123
0
{
124
0
  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
125
126
0
  cache_ptr->howto = elf32_wasm32_rtype_to_howto (abfd, r_type);
127
0
  return cache_ptr->howto != NULL;
128
0
}
129
130
#define ELF_ARCH    bfd_arch_wasm32
131
#define ELF_TARGET_ID   EM_WEBASSEMBLY
132
#define ELF_MACHINE_CODE  EM_WEBASSEMBLY
133
/* FIXME we don't have paged executables, see:
134
   https://github.com/pipcet/binutils-gdb/issues/4  */
135
#define ELF_MAXPAGESIZE   4096
136
137
#define TARGET_LITTLE_SYM wasm32_elf32_vec
138
#define TARGET_LITTLE_NAME  "elf32-wasm32"
139
140
#define elf_backend_can_gc_sections 1
141
#define elf_backend_rela_normal   1
142
/* For testing. */
143
#define elf_backend_want_dynrelro 1
144
145
#define elf_info_to_howto   elf32_wasm32_info_to_howto_rela
146
#define elf_info_to_howto_rel   NULL
147
148
#define bfd_elf32_bfd_reloc_type_lookup elf32_wasm32_reloc_type_lookup
149
#define bfd_elf32_bfd_reloc_name_lookup elf32_wasm32_reloc_name_lookup
150
151
#define ELF_DYNAMIC_INTERPRETER  "/sbin/elf-dynamic-interpreter.so"
152
153
#define elf_backend_want_got_plt  1
154
#define elf_backend_plt_readonly  1
155
#define elf_backend_got_header_size 0
156
157
#include "elf32-target.h"