1 |
/* picoJava specific support for 32-bit ELF |
/* picoJava specific support for 32-bit ELF |
2 |
Copyright 1999, 2000, 2001 Free Software Foundation, Inc. |
Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. |
3 |
Contributed by Steve Chamberlan of Transmeta (sac@pobox.com). |
Contributed by Steve Chamberlan of Transmeta (sac@pobox.com). |
4 |
|
|
5 |
This file is part of BFD, the Binary File Descriptor library. |
This file is part of BFD, the Binary File Descriptor library. |
32 |
static void pj_elf_info_to_howto |
static void pj_elf_info_to_howto |
33 |
PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); |
PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); |
34 |
static void pj_elf_final_write_processing |
static void pj_elf_final_write_processing |
35 |
PARAMS ((bfd *, boolean)); |
PARAMS ((bfd *, bfd_boolean)); |
36 |
|
|
37 |
static reloc_howto_type pj_elf_howto_table[] = |
static reloc_howto_type pj_elf_howto_table[] = |
38 |
{ |
{ |
41 |
0, /* rightshift */ |
0, /* rightshift */ |
42 |
0, /* size (0 = byte, 1 = short, 2 = long) */ |
0, /* size (0 = byte, 1 = short, 2 = long) */ |
43 |
0, /* bitsize */ |
0, /* bitsize */ |
44 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
45 |
0, /* bitpos */ |
0, /* bitpos */ |
46 |
complain_overflow_dont, /* complain_on_overflow */ |
complain_overflow_dont, /* complain_on_overflow */ |
47 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
48 |
"R_PJ_NONE", /* name */ |
"R_PJ_NONE", /* name */ |
49 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
50 |
0, /* src_mask */ |
0, /* src_mask */ |
51 |
0, /* dst_mask */ |
0, /* dst_mask */ |
52 |
false), /* pcrel_offset */ |
FALSE), /* pcrel_offset */ |
53 |
|
|
54 |
/* 32 bit absolute relocation. Setting partial_inplace to true and |
/* 32 bit absolute relocation. Setting partial_inplace to TRUE and |
55 |
src_mask to a non-zero value is similar to the COFF toolchain. */ |
src_mask to a non-zero value is similar to the COFF toolchain. */ |
56 |
HOWTO (R_PJ_DATA_DIR32, /* type */ |
HOWTO (R_PJ_DATA_DIR32, /* type */ |
57 |
0, /* rightshift */ |
0, /* rightshift */ |
58 |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
59 |
32, /* bitsize */ |
32, /* bitsize */ |
60 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
61 |
0, /* bitpos */ |
0, /* bitpos */ |
62 |
complain_overflow_bitfield, /* complain_on_overflow */ |
complain_overflow_bitfield, /* complain_on_overflow */ |
63 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
64 |
"R_PJ_DIR32", /* name */ |
"R_PJ_DIR32", /* name */ |
65 |
true, /* partial_inplace */ |
TRUE, /* partial_inplace */ |
66 |
0xffffffff, /* src_mask */ |
0xffffffff, /* src_mask */ |
67 |
0xffffffff, /* dst_mask */ |
0xffffffff, /* dst_mask */ |
68 |
false), /* pcrel_offset */ |
FALSE), /* pcrel_offset */ |
69 |
|
|
70 |
/* 32 bit PC relative relocation. */ |
/* 32 bit PC relative relocation. */ |
71 |
HOWTO (R_PJ_CODE_REL32, /* type */ |
HOWTO (R_PJ_CODE_REL32, /* type */ |
72 |
0, /* rightshift */ |
0, /* rightshift */ |
73 |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
74 |
32, /* bitsize */ |
32, /* bitsize */ |
75 |
true, /* pc_relative */ |
TRUE, /* pc_relative */ |
76 |
0, /* bitpos */ |
0, /* bitpos */ |
77 |
complain_overflow_signed, /* complain_on_overflow */ |
complain_overflow_signed, /* complain_on_overflow */ |
78 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
79 |
"R_PJ_REL32", /* name */ |
"R_PJ_REL32", /* name */ |
80 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
81 |
0, /* src_mask */ |
0, /* src_mask */ |
82 |
0xffffffff, /* dst_mask */ |
0xffffffff, /* dst_mask */ |
83 |
true), /* pcrel_offset */ |
TRUE), /* pcrel_offset */ |
84 |
|
|
85 |
/* 16 bit PC relative relocation. */ |
/* 16 bit PC relative relocation. */ |
86 |
HOWTO (R_PJ_CODE_REL16, /* type */ |
HOWTO (R_PJ_CODE_REL16, /* type */ |
87 |
0, /* rightshift */ |
0, /* rightshift */ |
88 |
1, /* size (0 = byte, 1 = short, 2 = long) */ |
1, /* size (0 = byte, 1 = short, 2 = long) */ |
89 |
16, /* bitsize */ |
16, /* bitsize */ |
90 |
true, /* pc_relative */ |
TRUE, /* pc_relative */ |
91 |
0, /* bitpos */ |
0, /* bitpos */ |
92 |
complain_overflow_signed, /* complain_on_overf6w */ |
complain_overflow_signed, /* complain_on_overf6w */ |
93 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
94 |
"R_PJ_REL16", /* name */ |
"R_PJ_REL16", /* name */ |
95 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
96 |
0xffff, /* src_mask */ |
0xffff, /* src_mask */ |
97 |
0xffff, /* dst_mask */ |
0xffff, /* dst_mask */ |
98 |
true), /* pcrel_offset */ |
TRUE), /* pcrel_offset */ |
99 |
EMPTY_HOWTO (4), |
EMPTY_HOWTO (4), |
100 |
EMPTY_HOWTO (5), |
EMPTY_HOWTO (5), |
101 |
HOWTO (R_PJ_CODE_DIR32, /* type */ |
HOWTO (R_PJ_CODE_DIR32, /* type */ |
102 |
0, /* rightshift */ |
0, /* rightshift */ |
103 |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
104 |
32, /* bitsize */ |
32, /* bitsize */ |
105 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
106 |
0, /* bitpos */ |
0, /* bitpos */ |
107 |
complain_overflow_bitfield, /* complain_on_overflow */ |
complain_overflow_bitfield, /* complain_on_overflow */ |
108 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
109 |
"R_PJ_CODE_DIR32", /* name */ |
"R_PJ_CODE_DIR32", /* name */ |
110 |
true, /* partial_inplace */ |
TRUE, /* partial_inplace */ |
111 |
0xffffffff, /* src_mask */ |
0xffffffff, /* src_mask */ |
112 |
0xffffffff, /* dst_mask */ |
0xffffffff, /* dst_mask */ |
113 |
false), /* pcrel_offset */ |
FALSE), /* pcrel_offset */ |
114 |
|
|
115 |
EMPTY_HOWTO (7), |
EMPTY_HOWTO (7), |
116 |
EMPTY_HOWTO (8), |
EMPTY_HOWTO (8), |
123 |
0, /* rightshift */ |
0, /* rightshift */ |
124 |
1, /* size (0 = byte, 1 = short, 2 = long) */ |
1, /* size (0 = byte, 1 = short, 2 = long) */ |
125 |
16, /* bitsize */ |
16, /* bitsize */ |
126 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
127 |
0, /* bitpos */ |
0, /* bitpos */ |
128 |
complain_overflow_unsigned, /* complain_on_overflow */ |
complain_overflow_unsigned, /* complain_on_overflow */ |
129 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
130 |
"R_PJ_LO16", /* name */ |
"R_PJ_LO16", /* name */ |
131 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
132 |
0xffff, /* src_mask */ |
0xffff, /* src_mask */ |
133 |
0xffff, /* dst_mask */ |
0xffff, /* dst_mask */ |
134 |
true), /* pcrel_offset */ |
TRUE), /* pcrel_offset */ |
135 |
|
|
136 |
HOWTO (R_PJ_CODE_HI16, /* type */ |
HOWTO (R_PJ_CODE_HI16, /* type */ |
137 |
16, /* rightshift */ |
16, /* rightshift */ |
138 |
1, /* size (0 = byte, 1 = short, 2 = long) */ |
1, /* size (0 = byte, 1 = short, 2 = long) */ |
139 |
16, /* bitsize */ |
16, /* bitsize */ |
140 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
141 |
0, /* bitpos */ |
0, /* bitpos */ |
142 |
complain_overflow_unsigned, /* complain_on_overflow */ |
complain_overflow_unsigned, /* complain_on_overflow */ |
143 |
pj_elf_reloc, /* special_function */ |
pj_elf_reloc, /* special_function */ |
144 |
"R_PJ_HI16", /* name */ |
"R_PJ_HI16", /* name */ |
145 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
146 |
0xffff, /* src_mask */ |
0xffff, /* src_mask */ |
147 |
0xffff, /* dst_mask */ |
0xffff, /* dst_mask */ |
148 |
true), /* pcrel_offset */ |
TRUE), /* pcrel_offset */ |
149 |
|
|
150 |
/* GNU extension to record C++ vtable hierarchy */ |
/* GNU extension to record C++ vtable hierarchy */ |
151 |
HOWTO (R_PJ_GNU_VTINHERIT, /* type */ |
HOWTO (R_PJ_GNU_VTINHERIT, /* type */ |
152 |
0, /* rightshift */ |
0, /* rightshift */ |
153 |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
154 |
0, /* bitsize */ |
0, /* bitsize */ |
155 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
156 |
0, /* bitpos */ |
0, /* bitpos */ |
157 |
complain_overflow_dont, /* complain_on_overflow */ |
complain_overflow_dont, /* complain_on_overflow */ |
158 |
NULL, /* special_function */ |
NULL, /* special_function */ |
159 |
"R_PJ_GNU_VTINHERIT", /* name */ |
"R_PJ_GNU_VTINHERIT", /* name */ |
160 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
161 |
0, /* src_mask */ |
0, /* src_mask */ |
162 |
0, /* dst_mask */ |
0, /* dst_mask */ |
163 |
false), /* pcrel_offset */ |
FALSE), /* pcrel_offset */ |
164 |
|
|
165 |
/* GNU extension to record C++ vtable member usage */ |
/* GNU extension to record C++ vtable member usage */ |
166 |
HOWTO (R_PJ_GNU_VTENTRY, /* type */ |
HOWTO (R_PJ_GNU_VTENTRY, /* type */ |
167 |
0, /* rightshift */ |
0, /* rightshift */ |
168 |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
2, /* size (0 = byte, 1 = short, 2 = long) */ |
169 |
0, /* bitsize */ |
0, /* bitsize */ |
170 |
false, /* pc_relative */ |
FALSE, /* pc_relative */ |
171 |
0, /* bitpos */ |
0, /* bitpos */ |
172 |
complain_overflow_dont, /* complain_on_overflow */ |
complain_overflow_dont, /* complain_on_overflow */ |
173 |
_bfd_elf_rel_vtable_reloc_fn, /* special_function */ |
_bfd_elf_rel_vtable_reloc_fn, /* special_function */ |
174 |
"R_PJ_GNU_VTENTRY", /* name */ |
"R_PJ_GNU_VTENTRY", /* name */ |
175 |
false, /* partial_inplace */ |
FALSE, /* partial_inplace */ |
176 |
0, /* src_mask */ |
0, /* src_mask */ |
177 |
0, /* dst_mask */ |
0, /* dst_mask */ |
178 |
false), /* pcrel_offset */ |
FALSE), /* pcrel_offset */ |
|
|
|
179 |
}; |
}; |
180 |
|
|
181 |
/* This function is used for normal relocs. This is like the COFF |
/* This function is used for normal relocs. This is like the COFF |
328 |
static void |
static void |
329 |
pj_elf_final_write_processing (abfd, linker) |
pj_elf_final_write_processing (abfd, linker) |
330 |
bfd *abfd; |
bfd *abfd; |
331 |
boolean linker ATTRIBUTE_UNUSED; |
bfd_boolean linker ATTRIBUTE_UNUSED; |
332 |
{ |
{ |
333 |
elf_elfheader (abfd)->e_flags |= EF_PICOJAVA_ARCH; |
elf_elfheader (abfd)->e_flags |= EF_PICOJAVA_ARCH; |
334 |
elf_elfheader (abfd)->e_flags |= EF_PICOJAVA_GNUCALLS; |
elf_elfheader (abfd)->e_flags |= EF_PICOJAVA_GNUCALLS; |