xref: /netbsd-src/external/gpl3/gdb.old/dist/bfd/elf32-csky.c (revision dd3ee07da436799d8de85f3055253118b76bf345)
1 /* 32-bit ELF support for C-SKY.
2    Copyright (C) 1998-2019 Free Software Foundation, Inc.
3    Contributed by C-SKY Microsystems and Mentor Graphics.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21 
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/csky.h"
28 #include "opcode/csky.h"
29 #include <assert.h>
30 #include "libiberty.h"
31 
32 /* Data structures used for merging different arch variants.
33    V1 (510/610) and V2 (8xx) processors are incompatible, but
34    we can merge wthin each family.  */
35 
36 enum merge_class
37 {
38   CSKY_V1,
39   CSKY_V2
40 };
41 
42 typedef struct csky_arch_for_merge
43 {
44   const char *name;
45   const unsigned long arch_eflag;
46   /* The files can merge only if they are in same class.  */
47   enum merge_class class;
48   /* When input files have different levels,
49      the target sets arch_eflag to the largest level file's arch_eflag.  */
50   unsigned int class_level;
51   /* Control whether to print warning when merging with different arch.  */
52   unsigned int do_warning;
53 } csky_arch_for_merge;
54 
55 static struct csky_arch_for_merge csky_archs[] =
56 {
57   /* 510 and 610 merge to 610 without warning.  */
58   { "510",  CSKY_ARCH_510,  CSKY_V1,  0, 0},
59   { "610",  CSKY_ARCH_610,  CSKY_V1,  1, 0},
60   /* 801, 802, 803, 807, 810 merge to largest one.  */
61   { "801",  CSKY_ARCH_801,  CSKY_V2,  0, 1},
62   { "802",  CSKY_ARCH_802,  CSKY_V2,  1, 1},
63   { "803",  CSKY_ARCH_803,  CSKY_V2,  2, 1},
64   { "807",  CSKY_ARCH_807,  CSKY_V2,  3, 1},
65   { "810",  CSKY_ARCH_810,  CSKY_V2,  4, 1},
66   { NULL, 0, 0, 0, 0}
67 };
68 
69 /* Return the ARCH bits out of ABFD.  */
70 #define bfd_csky_arch(abfd) \
71   (elf_elfheader (abfd)->e_flags & CSKY_ARCH_MASK)
72 
73 /* Return the ABI bits out of ABFD.  */
74 #define bfd_csky_abi(abfd) \
75   (elf_elfheader (abfd)->e_flags & CSKY_ABI_MASK)
76 
77 
78 /* The index of a howto-item is implicitly equal to
79    the corresponding Relocation Type Encoding.  */
80 static reloc_howto_type csky_elf_howto_table[] =
81 {
82   /* 0 */
83   HOWTO (R_CKCORE_NONE,               /* type */
84 	 0,                           /* rightshift */
85 	 0,                           /* size */
86 	 0,                           /* bitsize */
87 	 FALSE,                       /* pc_relative */
88 	 0,                           /* bitpos */
89 	 complain_overflow_dont,      /* complain_on_overflow */
90 	 NULL,                        /* special_function */
91 	 "R_CKCORE_NONE",             /* name */
92 	 FALSE,                       /* partial_inplace */
93 	 0,                           /* src_mask */
94 	 0,                           /* dst_mask */
95 	 FALSE),                      /* pcrel_offset */
96 
97   /* 1.  */
98   HOWTO (R_CKCORE_ADDR32,             /* type */
99 	 0,                           /* rightshift */
100 	 2,                           /* size */
101 	 32,                          /* bitsize */
102 	 FALSE,                       /* pc_relative */
103 	 0,                           /* bitpos */
104 	 complain_overflow_dont,      /* complain_on_overflow */
105 	 bfd_elf_generic_reloc,       /* special_function */
106 	 "R_CKCORE_ADDR32",           /* name */
107 	 FALSE,                       /* partial_inplace */
108 	 0,                           /* src_mask */
109 	 0xffffffff,                  /* dst_mask */
110 	 FALSE),                      /* pcrel_offset */
111 
112   /* 2: Only for csky v1.  */
113   HOWTO (R_CKCORE_PCREL_IMM8BY4,      /* type */
114 	 2,                           /* rightshift */
115 	 1,                           /* size */
116 	 8,                           /* bitsize */
117 	 TRUE,                        /* pc_relative */
118 	 0,                           /* bitpos */
119 	 complain_overflow_bitfield,  /* complain_on_overflow */
120 	 NULL,                        /* special_function */
121 	 "R_CKCORE_PCREL_IMM8BY4",    /* name */
122 	 FALSE,                       /* partial_inplace */
123 	 0xff,                        /* src_mask */
124 	 0xff,                        /* dst_mask */
125 	 TRUE),                       /* pcrel_offset */
126 
127   /* 3: Only for csky v1.  */
128   HOWTO (R_CKCORE_PCREL_IMM11BY2,     /* type */
129 	 1,                           /* rightshift */
130 	 1,                           /* size */
131 	 11,                          /* bitsize */
132 	 TRUE,                        /* pc_relative */
133 	 0,                           /* bitpos */
134 	 complain_overflow_signed,    /* complain_on_overflow */
135 	 bfd_elf_generic_reloc,       /* special_function */
136 	 "R_CKCORE_PCREL_IMM11BY2",   /* name */
137 	 FALSE,                       /* partial_inplace */
138 	 0x7ff,                       /* src_mask */
139 	 0x7ff,                       /* dst_mask */
140 	 TRUE),                       /* pcrel_offset */
141 
142   /* 4: DELETED.  */
143   HOWTO (R_CKCORE_PCREL_IMM4BY2,0,0,0,0,0,0,0,"R_CKCORE_PCREL_IMM4BY2",0,0,0,0),
144 
145   /* 5.  */
146   HOWTO (R_CKCORE_PCREL32,            /* type */
147 	 0,                           /* rightshift */
148 	 2,                           /* size */
149 	 32,                          /* bitsize */
150 	 TRUE,                        /* pc_relative */
151 	 0,                           /* bitpos */
152 	 complain_overflow_dont,      /* complain_on_overflow */
153 	 bfd_elf_generic_reloc,       /* special_function */
154 	 "R_CKCORE_PCREL32",          /* name */
155 	 FALSE,                       /* partial_inplace */
156 	 0x0,                         /* src_mask */
157 	 0xffffffff,                  /* dst_mask */
158 	 TRUE),                       /* pcrel_offset */
159 
160   /* 6: Only for csky v1.  */
161   HOWTO (R_CKCORE_PCREL_JSR_IMM11BY2, /* type */
162 	 1,                           /* rightshift */
163 	 1,                           /* size */
164 	 11,                          /* bitsize */
165 	 TRUE,                        /* pc_relative */
166 	 0,                           /* bitpos */
167 	 complain_overflow_signed,    /* complain_on_overflow */
168 	 bfd_elf_generic_reloc,       /* special_function */
169 	 "R_CKCORE_PCREL_JSR_IMM11BY2", /* name */
170 	 FALSE,                       /* partial_inplace */
171 	 0x7ff,                       /* src_mask */
172 	 0x7ff,                       /* dst_mask */
173 	 TRUE),                       /* pcrel_offset */
174 
175   /* 7: GNU extension to record C++ vtable member usage.  */
176   HOWTO (R_CKCORE_GNU_VTENTRY,        /* type */
177 	 0,                           /* rightshift */
178 	 2,                           /* size */
179 	 0,                           /* bitsize */
180 	 FALSE,                       /* pc_relative */
181 	 0,                           /* bitpos */
182 	 complain_overflow_dont,      /* complain_on_overflow */
183 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
184 	 "R_CKCORE_GNU_VTENTRY",      /* name */
185 	 FALSE,                       /* partial_inplace */
186 	 0x0,                         /* src_mask */
187 	 0x0,                         /* dst_mask */
188 	 FALSE),                      /* pcrel_offset */
189 
190   /* 8: GNU extension to record C++ vtable hierarchy.  */
191   HOWTO (R_CKCORE_GNU_VTINHERIT,      /* type */
192 	 0,                           /* rightshift */
193 	 2,                           /* size */
194 	 0,                           /* bitsize */
195 	 FALSE,                       /* pc_relative */
196 	 0,                           /* bitpos */
197 	 complain_overflow_dont,      /* complain_on_overflow */
198 	 NULL,                        /* special_function */
199 	 "R_CKCORE_GNU_VTINHERIT",    /* name */
200 	 FALSE,                       /* partial_inplace */
201 	 0x0,                         /* src_mask */
202 	 0x0,                         /* dst_mask */
203 	 FALSE),                      /* pcrel_offset */
204 
205   /* 9.  */
206   HOWTO (R_CKCORE_RELATIVE,           /* type */
207 	 0,                           /* rightshift */
208 	 2,                           /* size */
209 	 32,                          /* bitsize */
210 	 FALSE,                       /* pc_relative */
211 	 0,                           /* bitpos */
212 	 complain_overflow_signed,    /* complain_on_overflow */
213 	 bfd_elf_generic_reloc,       /* special_function */
214 	 "R_CKCORE_RELATIVE",         /* name */
215 	 TRUE,                        /* partial_inplace */
216 	 0x0,                         /* src_mask */
217 	 0xffffffff,                  /* dst_mask */
218 	 FALSE),                      /* pcrel_offset */
219 
220   /* 10: None.  */
221   /* FIXME:  It is a bug that copy relocations are not implemented.  */
222   HOWTO (R_CKCORE_COPY,               /* type */
223 	 0,                           /* rightshift */
224 	 2,                           /* size */
225 	 32,                          /* bitsize */
226 	 FALSE,                       /* pc_relative */
227 	 0,                           /* bitpos */
228 	 complain_overflow_bitfield,  /* complain_on_overflow */
229 	 bfd_elf_generic_reloc,       /* special_function */
230 	 "R_CKCORE_COPY",             /* name */
231 	 TRUE,                        /* partial_inplace */
232 	 0xffffffff,                  /* src_mask */
233 	 0xffffffff,                  /* dst_mask */
234 	 FALSE),                      /* pcrel_offset */
235 
236   /* 11: None.  */
237   HOWTO (R_CKCORE_GLOB_DAT,0,0,0,0,0,0,0,"R_CKCORE_GLOB_DAT",0,0,0,0),
238 
239   /* 12: None.  */
240   HOWTO (R_CKCORE_JUMP_SLOT,0,0,0,0,0,0,0,"R_CKCORE_JUMP_SLOT",0,0,0,0),
241 
242   /* 13.  */
243   HOWTO (R_CKCORE_GOTOFF,             /* type */
244 	 0,                           /* rightshift */
245 	 2,                           /* size */
246 	 32,                          /* bitsize */
247 	 FALSE,                       /* pc_relative */
248 	 0,                           /* bitpos */
249 	 complain_overflow_dont,      /* complain_on_overflow */
250 	 bfd_elf_generic_reloc,       /* special_function */
251 	 "R_CKCORE_GOTOFF",           /* name */
252 	 TRUE,                        /* partial_inplace */
253 	 0x0,                         /* src_mask */
254 	 0xffffffffl,                 /* dst_mask */
255 	 FALSE),                      /* pcrel_offset */
256 
257   /* 14.  */
258   HOWTO (R_CKCORE_GOTPC,              /* type */
259 	 0,                           /* rightshift */
260 	 2,                           /* size */
261 	 32,                          /* bitsize */
262 	 TRUE,                        /* pc_relative */
263 	 0,                           /* bitpos */
264 	 complain_overflow_dont,      /* complain_on_overflow */
265 	 bfd_elf_generic_reloc,       /* special_function */
266 	 "R_CKCORE_GOTPC",            /* name */
267 	 TRUE,                        /* partial_inplace */
268 	 0x0,                         /* src_mask */
269 	 0xffffffff,                  /* dst_mask */
270 	 FALSE),                      /* pcrel_offset */
271 
272   /* 15.  */
273   HOWTO (R_CKCORE_GOT32,              /* type */
274 	 0,                           /* rightshift */
275 	 2,                           /* size */
276 	 32,                          /* bitsize */
277 	 FALSE,                       /* pc_relative */
278 	 0,                           /* bitpos */
279 	 complain_overflow_dont,      /* complain_on_overflow */
280 	 bfd_elf_generic_reloc,       /* special_function */
281 	 "R_CKCORE_GOT32",            /* name */
282 	 TRUE,                        /* partial_inplace */
283 	 0x0,                         /* src_mask */
284 	 0xffffffff,                  /* dst_mask */
285 	 TRUE),                       /* pcrel_offset */
286 
287   /* 16.  */
288   HOWTO (R_CKCORE_PLT32,              /* type */
289 	 0,                           /* rightshift */
290 	 2,                           /* size */
291 	 32,                          /* bitsize */
292 	 FALSE,                       /* pc_relative */
293 	 0,                           /* bitpos */
294 	 complain_overflow_dont,      /* complain_on_overflow */
295 	 bfd_elf_generic_reloc,       /* special_function */
296 	 "R_CKCORE_PLT32",            /* name */
297 	 TRUE,                        /* partial_inplace */
298 	 0x0,                         /* src_mask */
299 	 0xffffffff,                  /* dst_mask */
300 	 TRUE),                       /* pcrel_offset */
301 
302   /* 17: None.  */
303   HOWTO (R_CKCORE_ADDRGOT,0,0,0,0,0,0,0,"R_CKCORE_ADDRGOT",0,0,0,0),
304 
305   /* 18: None.  */
306   HOWTO (R_CKCORE_ADDRPLT,0,0,0,0,0,0,0,"R_CKCORE_ADDRPLT",0,0,0,0),
307 
308   /* 19: Only for csky v2.  */
309   HOWTO (R_CKCORE_PCREL_IMM26BY2,     /* type */
310 	 1,                           /* rightshift */
311 	 2,                           /* size */
312 	 26,                          /* bitsize */
313 	 TRUE,                        /* pc_relative */
314 	 0,                           /* bitpos */
315 	 complain_overflow_signed,    /* complain_on_overflow */
316 	 bfd_elf_generic_reloc,       /* special_function */
317 	 "R_CKCORE_PCREL_IMM26BY2",   /* name */
318 	 FALSE,                       /* partial_inplace */
319 	 0x0,                         /* src_mask */
320 	 0x3ffffff,                   /* dst_mask */
321 	 TRUE),                       /* pcrel_offset */
322 
323   /* 20: Only for csky v2.  */
324   HOWTO (R_CKCORE_PCREL_IMM16BY2,     /* type */
325 	 1,                           /* rightshift */
326 	 2,                           /* size */
327 	 16,                          /* bitsize */
328 	 TRUE,                        /* pc_relative */
329 	 0,                           /* bitpos */
330 	 complain_overflow_signed,    /* complain_on_overflow */
331 	 NULL,                        /* special_function */
332 	 "R_CKCORE_PCREL_IMM16BY2",   /* name */
333 	 FALSE,                       /* partial_inplace */
334 	 0x0,                         /* src_mask */
335 	 0xffff,                      /* dst_mask */
336 	 TRUE),                       /* pcrel_offset */
337 
338   /* 21: Only for csky v2.  */
339   HOWTO (R_CKCORE_PCREL_IMM16BY4,     /* type */
340 	 2,                           /* rightshift */
341 	 2,                           /* size */
342 	 16,                          /* bitsize */
343 	 TRUE,                        /* pc_relative */
344 	 0,                           /* bitpos */
345 	 complain_overflow_bitfield,  /* complain_on_overflow */
346 	 NULL,                        /* special_function */
347 	 "R_CKCORE_PCREL_IMM16BY4",   /* name */
348 	 FALSE,                       /* partial_inplace */
349 	 0xffff0000,                  /* src_mask */
350 	 0xffff,                      /* dst_mask */
351 	 TRUE),                       /* pcrel_offset */
352 
353   /* 22: Only for csky v2.  */
354   HOWTO (R_CKCORE_PCREL_IMM10BY2,     /* type */
355 	 1,                           /* rightshift */
356 	 1,                           /* size */
357 	 10,                          /* bitsize */
358 	 TRUE,                        /* pc_relative */
359 	 0,                           /* bitpos */
360 	 complain_overflow_signed,    /* complain_on_overflow */
361 	 bfd_elf_generic_reloc,       /* special_function */
362 	 "R_CKCORE_PCREL_IMM10BY2",   /* name */
363 	 FALSE,                       /* partial_inplace */
364 	 0x0,                         /* src_mask */
365 	 0x3ff,                       /* dst_mask */
366 	 TRUE),                       /* pcrel_offset */
367 
368   /* 23: Only for csky v2.  */
369   HOWTO (R_CKCORE_PCREL_IMM10BY4,     /* type */
370 	 2,                           /* rightshift */
371 	 2,                           /* size */
372 	 10,                          /* bitsize */
373 	 TRUE,                        /* pc_relative */
374 	 0,                           /* bitpos */
375 	 complain_overflow_bitfield,  /* complain_on_overflow */
376 	 NULL,                        /* special_function */
377 	 "R_CKCORE_PCREL_IMM10BY4",   /* name */
378 	 FALSE,                       /* partial_inplace */
379 	 0x0,                         /* src_mask */
380 	 0x3ff,                       /* dst_mask */
381 	 TRUE),                       /* pcrel_offset */
382 
383   /* 24: Only for csky v2.  */
384   HOWTO (R_CKCORE_ADDR_HI16,          /* type */
385 	 16,                          /* rightshift */
386 	 2,                           /* size */
387 	 16,                          /* bitsize */
388 	 FALSE,                       /* pc_relative */
389 	 0,                           /* bitpos */
390 	 complain_overflow_dont,      /* complain_on_overflow */
391 	 bfd_elf_generic_reloc,       /* special_function */
392 	 "R_CKCORE_ADDR_HI16",        /* name */
393 	 FALSE,                       /* partial_inplace */
394 	 0x0,                         /* src_mask */
395 	 0xffff,                      /* dst_mask */
396 	 FALSE),                      /* pcrel_offset */
397 
398   /* 25.  */
399   HOWTO (R_CKCORE_ADDR_LO16,          /* type */
400 	 0,                           /* rightshift */
401 	 2,                           /* size */
402 	 16,                          /* bitsize */
403 	 FALSE,                       /* pc_relative */
404 	 0,                           /* bitpos */
405 	 complain_overflow_dont,      /* complain_on_overflow */
406 	 bfd_elf_generic_reloc,       /* special_function */
407 	 "R_CKCORE_ADDR_LO16",        /* name */
408 	 FALSE,                       /* partial_inplace */
409 	 0x0,                         /* src_mask */
410 	 0xffff,                      /* dst_mask */
411 	 FALSE),                      /* pcrel_offset */
412 
413   /* 26.  */
414   HOWTO (R_CKCORE_GOTPC_HI16,         /* type */
415 	 16,                          /* rightshift */
416 	 2,                           /* size */
417 	 16,                          /* bitsize */
418 	 TRUE,                        /* pc_relative */
419 	 0,                           /* bitpos */
420 	 complain_overflow_dont,      /* complain_on_overflow */
421 	 bfd_elf_generic_reloc,       /* special_function */
422 	 "R_CKCORE_GOTPC_HI16",       /* name */
423 	 FALSE,                       /* partial_inplace */
424 	 0x0,                         /* src_mask */
425 	 0xffff,                      /* dst_mask */
426 	 FALSE),                      /* pcrel_offset */
427 
428   /* 27.  */
429   HOWTO (R_CKCORE_GOTPC_LO16,         /* type */
430 	 0,                           /* rightshift */
431 	 2,                           /* size */
432 	 16,                          /* bitsize */
433 	 TRUE,                        /* pc_relative */
434 	 0,                           /* bitpos */
435 	 complain_overflow_dont,      /* complain_on_overflow */
436 	 bfd_elf_generic_reloc,       /* special_function */
437 	 "R_CKCORE_GOTPC_LO16",       /* name */
438 	 FALSE,                       /* partial_inplace */
439 	 0x0,                         /* src_mask */
440 	 0xffff,                      /* dst_mask */
441 	 FALSE),                      /* pcrel_offset */
442 
443   /* 28.  */
444   HOWTO (R_CKCORE_GOTOFF_HI16,        /* type */
445 	 16,                          /* rightshift */
446 	 2,                           /* size */
447 	 16,                          /* bitsize */
448 	 FALSE,                       /* pc_relative */
449 	 0,                           /* bitpos */
450 	 complain_overflow_dont,      /* complain_on_overflow */
451 	 bfd_elf_generic_reloc,       /* special_function */
452 	 "R_CKCORE_GOTOFF_HI16",      /* name */
453 	 FALSE,                       /* partial_inplace */
454 	 0x0,                         /* src_mask */
455 	 0xffff,                      /* dst_mask */
456 	 FALSE),                      /* pcrel_offset */
457 
458   /* 29.  */
459   HOWTO (R_CKCORE_GOTOFF_LO16,        /* type */
460 	 0,                           /* rightshift */
461 	 2,                           /* size */
462 	 16,                          /* bitsize */
463 	 FALSE,                       /* pc_relative */
464 	 0,                           /* bitpos */
465 	 complain_overflow_dont,      /* complain_on_overflow */
466 	 bfd_elf_generic_reloc,       /* special_function */
467 	 "R_CKCORE_GOTOFF_LO16",      /* name */
468 	 FALSE,                       /* partial_inplace */
469 	 0x0,                         /* src_mask */
470 	 0xffff,                      /* dst_mask */
471 	 FALSE),                      /* pcrel_offset */
472 
473   /* 30.  */
474   HOWTO (R_CKCORE_GOT12,              /* type */
475 	 2,                           /* rightshift */
476 	 2,                           /* size */
477 	 12,                          /* bitsize */
478 	 FALSE,                       /* pc_relative */
479 	 0,                           /* bitpos */
480 	 complain_overflow_bitfield,  /* complain_on_overflow */
481 	 bfd_elf_generic_reloc,       /* special_function */
482 	 "R_CKCORE_GOT12",            /* name */
483 	 TRUE,                        /* partial_inplace */
484 	 0x0,                         /* src_mask */
485 	 0xfff,                       /* dst_mask */
486 	 FALSE),                      /* pcrel_offset */
487 
488   /* 31.  */
489   HOWTO (R_CKCORE_GOT_HI16,           /* type */
490 	 16,                          /* rightshift */
491 	 2,                           /* size */
492 	 16,                          /* bitsize */
493 	 FALSE,                       /* pc_relative */
494 	 0,                           /* bitpos */
495 	 complain_overflow_dont,      /* complain_on_overflow */
496 	 bfd_elf_generic_reloc,       /* special_function */
497 	 "R_CKCORE_GOT_HI16",         /* name */
498 	 TRUE,                       /* partial_inplace */
499 	 0x0,                         /* src_mask */
500 	 0xffff,                      /* dst_mask */
501 	 FALSE),                      /* pcrel_offset */
502 
503   /* 32.  */
504   HOWTO (R_CKCORE_GOT_LO16,           /* type */
505 	 0,                           /* rightshift */
506 	 2,                           /* size */
507 	 16,                          /* bitsize */
508 	 FALSE,                       /* pc_relative */
509 	 0,                           /* bitpos */
510 	 complain_overflow_dont,      /* complain_on_overflow */
511 	 bfd_elf_generic_reloc,       /* special_function */
512 	 "R_CKCORE_GOT_LO16",         /* name */
513 	 TRUE,                        /* partial_inplace */
514 	 0x0,                         /* src_mask */
515 	 0xffff,                      /* dst_mask */
516 	 FALSE),                      /* pcrel_offset */
517 
518   /* 33.  */
519   HOWTO (R_CKCORE_PLT12,              /* type */
520 	 2,                           /* rightshift */
521 	 2,                           /* size */
522 	 12,                          /* bitsize */
523 	 FALSE,                       /* pc_relative */
524 	 0,                           /* bitpos */
525 	 complain_overflow_bitfield,  /* complain_on_overflow */
526 	 bfd_elf_generic_reloc,       /* special_function */
527 	 "R_CKCORE_PLT12",            /* name */
528 	 TRUE,                        /* partial_inplace */
529 	 0x0,                         /* src_mask */
530 	 0xfff,                       /* dst_mask */
531 	 FALSE),                      /* pcrel_offset */
532 
533   /* 34.  */
534   HOWTO (R_CKCORE_PLT_HI16,           /* type */
535 	 16,                          /* rightshift */
536 	 2,                           /* size */
537 	 16,                          /* bitsize */
538 	 FALSE,                       /* pc_relative */
539 	 0,                           /* bitpos */
540 	 complain_overflow_dont,      /* complain_on_overflow */
541 	 bfd_elf_generic_reloc,       /* special_function */
542 	 "R_CKCORE_PLT_HI16",         /* name */
543 	 TRUE,                        /* partial_inplace */
544 	 0x0,                         /* src_mask */
545 	 0xffff,                      /* dst_mask */
546 	 FALSE),                      /* pcrel_offset */
547 
548   /* 35.  */
549   HOWTO (R_CKCORE_PLT_LO16,           /* type */
550 	 0,                           /* rightshift */
551 	 2,                           /* size */
552 	 16,                          /* bitsize */
553 	 FALSE,                       /* pc_relative */
554 	 0,                           /* bitpos */
555 	 complain_overflow_dont,      /* complain_on_overflow */
556 	 bfd_elf_generic_reloc,       /* special_function */
557 	 "R_CKCORE_PLT_LO16",         /* name */
558 	 TRUE,                       /* partial_inplace */
559 	 0x0,                         /* src_mask */
560 	 0xffff,                      /* dst_mask */
561 	 FALSE),                      /* pcrel_offset */
562 
563   /* 36: None.  */
564   HOWTO (R_CKCORE_ADDRGOT_HI16,0,0,0,0,0,0,0,"R_CKCORE_",0,0,0,0),
565 
566   /* 37: None.  */
567   HOWTO (R_CKCORE_ADDRGOT_LO16,0,0,0,0,0,0,0,"R_CKCORE_",0,0,0,0),
568 
569   /* 38: None.  */
570   HOWTO (R_CKCORE_ADDRPLT_HI16,0,0,0,0,0,0,0,"R_CKCORE_",0,0,0,0),
571 
572   /* 39: None.  */
573   HOWTO (R_CKCORE_ADDRPLT_LO16,0,0,0,0,0,0,0,"R_CKCORE_",0,0,0,0),
574 
575   /* 40.  */
576   HOWTO (R_CKCORE_PCREL_JSR_IMM26BY2, /* type */
577 	 1,                           /* rightshift */
578 	 2,                           /* size */
579 	 26,                          /* bitsize */
580 	 TRUE,                        /* pc_relative */
581 	 0,                           /* bitpos */
582 	 complain_overflow_signed,    /* complain_on_overflow */
583 	 bfd_elf_generic_reloc,       /* special_function */
584 	 "R_CKCORE_PCREL_JSR_IMM26BY2", /* name */
585 	 FALSE,                       /* partial_inplace */
586 	 0x0,                         /* src_mask */
587 	 0x3ffffff,                   /* dst_mask */
588 	 TRUE),                       /* pcrel_offset */
589 
590   /* 41.  */
591   HOWTO (R_CKCORE_TOFFSET_LO16,       /* type */
592 	 0,                           /* rightshift */
593 	 2,                           /* size */
594 	 16,                          /* bitsize */
595 	 FALSE,                       /* pc_relative */
596 	 0,                           /* bitpos */
597 	 complain_overflow_unsigned,  /* complain_on_overflow */
598 	 NULL,                        /* special_function */
599 	 "R_CKCORE_TOFFSET_LO16",     /* name */
600 	 FALSE,                       /* partial_inplace */
601 	 0x0,                         /* src_mask */
602 	 0xffff,                      /* dst_mask */
603 	 FALSE),                      /* pcrel_offset */
604 
605   /* 42.  */
606   HOWTO (R_CKCORE_DOFFSET_LO16,       /* type */
607 	 0,                           /* rightshift */
608 	 2,                           /* size */
609 	 16,                          /* bitsize */
610 	 FALSE,                       /* pc_relative */
611 	 0,                           /* bitpos */
612 	 complain_overflow_unsigned,  /* complain_on_overflow */
613 	 NULL,                        /* special_function */
614 	 "R_CKCORE_DOFFSET_LO16",     /* name */
615 	 FALSE,                       /* partial_inplace */
616 	 0x0,                         /* src_mask */
617 	 0xffff,                      /* dst_mask */
618 	 FALSE),                      /* pcrel_offset */
619 
620   /* 43.  */
621   HOWTO (R_CKCORE_PCREL_IMM18BY2,     /* type */
622 	 1,                           /* rightshift */
623 	 2,                           /* size */
624 	 18,                          /* bitsize */
625 	 TRUE,                        /* pc_relative */
626 	 0,                           /* bitpos */
627 	 complain_overflow_signed,    /* complain_on_overflow */
628 	 NULL,                        /* special_function */
629 	 "R_CKCORE_PCREL_IMM18BY2",   /* name */
630 	 FALSE,                       /* partial_inplace */
631 	 0x0,                         /* src_mask */
632 	 0x3ffff,                     /* dst_mask */
633 	 TRUE),                       /* pcrel_offset */
634 
635   /* 44.  */
636   HOWTO (R_CKCORE_DOFFSET_IMM18,      /* type */
637 	 0,                           /* rightshift */
638 	 2,                           /* size */
639 	 18,                          /* bitsize */
640 	 FALSE,                       /* pc_relative */
641 	 0,                           /* bitpos */
642 	 complain_overflow_unsigned,  /* complain_on_overflow */
643 	 NULL,                        /* special_function */
644 	 "R_CKCORE_DOFFSET_IMM18",    /* name */
645 	 FALSE,                       /* partial_inplace */
646 	 0x0,                         /* src_mask */
647 	 0x3ffff,                     /* dst_mask */
648 	 FALSE),                      /* pcrel_offset */
649 
650   /* 45.  */
651   HOWTO (R_CKCORE_DOFFSET_IMM18BY2,   /* type */
652 	 1,                           /* rightshift */
653 	 2,                           /* size */
654 	 18,                          /* bitsize */
655 	 FALSE,                       /* pc_relative */
656 	 0,                           /* bitpos */
657 	 complain_overflow_unsigned,  /* complain_on_overflow */
658 	 NULL,                        /* special_function */
659 	 "R_CKCORE_DOFFSET_IMM18BY2", /* name */
660 	 FALSE,                       /* partial_inplace */
661 	 0x0,                         /* src_mask */
662 	 0x3ffff,                     /* dst_mask */
663 	 FALSE),                      /* pcrel_offset */
664 
665   /* 46.  */
666   HOWTO (R_CKCORE_DOFFSET_IMM18BY4,   /* type */
667 	 2,                           /* rightshift */
668 	 2,                           /* size */
669 	 18,                          /* bitsize */
670 	 FALSE,                       /* pc_relative */
671 	 0,                           /* bitpos */
672 	 complain_overflow_unsigned,  /* complain_on_overflow */
673 	 NULL,                        /* special_function */
674 	 "R_CKCORE_DOFFSET_IMM18BY4", /* name */
675 	 FALSE,                       /* partial_inplace */
676 	 0x0,                         /* src_mask */
677 	 0x3ffff,                     /* dst_mask */
678 	 FALSE),                      /* pcrel_offset */
679 
680   /* 47.  */
681   HOWTO (R_CKCORE_GOTOFF_IMM18,       /* type */
682 	 0,                           /* rightshift */
683 	 2,                           /* size */
684 	 18,                          /* bitsize */
685 	 FALSE,                       /* pc_relative */
686 	 0,                           /* bitpos */
687 	 complain_overflow_bitfield,  /* complain_on_overflow */
688 	 bfd_elf_generic_reloc,       /* special_function */
689 	 "R_CKCORE_GOTOFF_IMM18",     /* name */
690 	 TRUE,                        /* partial_inplace */
691 	 0xfffc,                      /* src_mask */
692 	 0x3ffff,                     /* dst_mask */
693 	 FALSE),                      /* pcrel_offset */
694 
695   /* 48.  */
696   HOWTO (R_CKCORE_GOT_IMM18BY4,       /* type */
697 	 2,                           /* rightshift */
698 	 2,                           /* size */
699 	 18,                          /* bitsize */
700 	 FALSE,                       /* pc_relative */
701 	 0,                           /* bitpos */
702 	 complain_overflow_bitfield,  /* complain_on_overflow */
703 	 bfd_elf_generic_reloc,       /* special_function */
704 	 "R_CKCORE_GOT_IMM18BY4",     /* name */
705 	 TRUE,                        /* partial_inplace */
706 	 0xfffc,                      /* src_mask */
707 	 0x3ffff,                     /* dst_mask */
708 	 FALSE),                      /* pcrel_offset */
709 
710   /* 49.  */
711   HOWTO (R_CKCORE_PLT_IMM18BY4,       /* type */
712 	 2,                           /* rightshift */
713 	 2,                           /* size */
714 	 18,                          /* bitsize */
715 	 FALSE,                       /* pc_relative */
716 	 0,                           /* bitpos */
717 	 complain_overflow_bitfield,  /* complain_on_overflow */
718 	 bfd_elf_generic_reloc,       /* special_function */
719 	 "R_CKCORE_PLT_IMM18BY4",     /* name */
720 	 TRUE,                        /* partial_inplace */
721 	 0xfffc,                      /* src_mask */
722 	 0x3ffff,                     /* dst_mask */
723 	 TRUE),                       /* pcrel_offset */
724 
725   /* 50: for lrw16.  */
726   HOWTO (R_CKCORE_PCREL_IMM7BY4,      /* type */
727 	 2,                           /* rightshift */
728 	 1,                           /* size */
729 	 7,                           /* bitsize */
730 	 TRUE,                        /* pc_relative */
731 	 0,                           /* bitpos */
732 	 complain_overflow_bitfield,  /* complain_on_overflow */
733 	 bfd_elf_generic_reloc,       /* special_function */
734 	 "R_CKCORE_PCREL_IMM7BY4",    /* name */
735 	 FALSE,                       /* partial_inplace */
736 	 0xec1f,                      /* src_mask */
737 	 0x31f,                       /* dst_mask */
738 	 TRUE),                       /* pcrel_offset */
739 
740   /* 51: for static nptl.  */
741   HOWTO (R_CKCORE_TLS_LE32,           /* type */
742 	 0,                           /* rightshift */
743 	 2,                           /* size */
744 	 32,                          /* bitsize */
745 	 FALSE,                       /* pc_relative */
746 	 0,                           /* bitpos */
747 	 complain_overflow_dont,      /* complain_on_overflow */
748 	 bfd_elf_generic_reloc,       /* special_function */
749 	 "R_CKCORE_TLS_LE32",         /* name */
750 	 FALSE,                       /* partial_inplace */
751 	 0x0,                         /* src_mask */
752 	 0xffffffff,                  /* dst_mask */
753 	 TRUE),                       /* pcrel_offset */
754 
755   /* 52: for static nptl.  */
756   HOWTO (R_CKCORE_TLS_IE32,           /* type */
757 	 0,                           /* rightshift */
758 	 2,                           /* size */
759 	 32,                          /* bitsize */
760 	 FALSE,                       /* pc_relative */
761 	 0,                           /* bitpos */
762 	 complain_overflow_dont,      /* complain_on_overflow */
763 	 bfd_elf_generic_reloc,       /* special_function */
764 	 "R_CKCORE_TLS_IE32",         /* name */
765 	 FALSE,                       /* partial_inplace */
766 	 0x0,                         /* src_mask */
767 	 0xffffffff,                  /* dst_mask */
768 	 TRUE),                       /* pcrel_offset */
769 
770   /* 53: for pic nptl.  */
771   HOWTO (R_CKCORE_TLS_GD32,           /* type */
772 	 0,                           /* rightshift */
773 	 2,                           /* size */
774 	 32,                          /* bitsize */
775 	 FALSE,                       /* pc_relative */
776 	 0,                           /* bitpos */
777 	 complain_overflow_dont,      /* complain_on_overflow */
778 	 bfd_elf_generic_reloc,       /* special_function */
779 	 "R_CKCORE_TLS_GD32",         /* name */
780 	 FALSE,                       /* partial_inplace */
781 	 0x0,                         /* src_mask */
782 	 0xffffffff,                  /* dst_mask */
783 	 TRUE),                       /* pcrel_offset */
784 
785   /* 54: for pic nptl.  */
786   HOWTO (R_CKCORE_TLS_LDM32,          /* type */
787 	 0,                           /* rightshift */
788 	 2,                           /* size */
789 	 32,                          /* bitsize */
790 	 FALSE,                       /* pc_relative */
791 	 0,                           /* bitpos */
792 	 complain_overflow_dont,      /* complain_on_overflow */
793 	 bfd_elf_generic_reloc,       /* special_function */
794 	 "R_CKCORE_TLS_LDM32",        /* name */
795 	 FALSE,                       /* partial_inplace */
796 	 0x0,                         /* src_mask */
797 	 0xffffffff,                  /* dst_mask */
798 	 TRUE),                       /* pcrel_offset */
799 
800   /* 55: for pic nptl.  */
801   HOWTO (R_CKCORE_TLS_LDO32,          /* type */
802 	 0,                           /* rightshift */
803 	 2,                           /* size */
804 	 32,                          /* bitsize */
805 	 FALSE,                       /* pc_relative */
806 	 0,                           /* bitpos */
807 	 complain_overflow_dont,      /* complain_on_overflow */
808 	 bfd_elf_generic_reloc,       /* special_function */
809 	 "R_CKCORE_TLS_LDO32",        /* name */
810 	 FALSE,                       /* partial_inplace */
811 	 0x0,                         /* src_mask */
812 	 0xffffffff,                  /* dst_mask */
813 	 TRUE),                       /* pcrel_offset */
814 
815   /* 56: for linker.  */
816   HOWTO (R_CKCORE_TLS_DTPMOD32,0,0,0,0,0,0,0,"R_CKCORE_TLS_DTPMOD32",0,0,0,0),
817 
818   /* 57: for linker.  */
819   HOWTO (R_CKCORE_TLS_DTPOFF32,0,0,0,0,0,0,0,"R_CKCORE_TLS_DTPOFF32",0,0,0,0),
820 
821   /* 58: for linker.  */
822   HOWTO (R_CKCORE_TLS_TPOFF32,0,0,0,0,0,0,0,"R_CKCORE_TLS_TPOFF32",0,0,0,0),
823 
824   /* 59: for ck807f.  */
825   HOWTO (R_CKCORE_PCREL_FLRW_IMM8BY4, /* type */
826 	 2,                           /* rightshift */
827 	 2,                           /* size */
828 	 8,                           /* bitsize */
829 	 TRUE,                        /* pc_relative */
830 	 0,                           /* bitpos */
831 	 complain_overflow_bitfield,  /* complain_on_overflow */
832 	 NULL,                        /* special_function */
833 	 "R_CKCORE_PCREL_FLRW_IMM8BY4", /* name */
834 	 FALSE,                       /* partial_inplace */
835 	 0xfe1fff0f,                  /* src_mask */
836 	 0x1e000f0,                   /* dst_mask */
837 	 TRUE),                       /* pcrel_offset */
838 
839   /* 60: for 810 not to generate jsri.  */
840   HOWTO (R_CKCORE_NOJSRI,             /* type */
841 	 0,                           /* rightshift */
842 	 2,                           /* size */
843 	 32,                          /* bitsize */
844 	 FALSE,                       /* pc_relative */
845 	 0,                           /* bitpos */
846 	 complain_overflow_dont,      /* complain_on_overflow */
847 	 bfd_elf_generic_reloc,       /* special_function */
848 	 "R_CKCORE_NOJSRI",           /* name */
849 	 FALSE,                       /* partial_inplace */
850 	 0xffff,                      /* src_mask */
851 	 0xffff,                      /* dst_mask */
852 	 FALSE),                      /* pcrel_offset */
853 
854   /* 61: for callgraph.  */
855   HOWTO (R_CKCORE_CALLGRAPH,          /* type */
856 	 0,                           /* rightshift */
857 	 0,                           /* size */
858 	 0,                           /* bitsize */
859 	 FALSE,                       /* pc_relative */
860 	 0,                           /* bitpos */
861 	 complain_overflow_dont,      /* complain_on_overflow */
862 	 NULL,                        /* special_function */
863 	 "R_CKCORE_CALLGRAPH",        /* name */
864 	 FALSE,                       /* partial_inplace */
865 	 0x0,                         /* src_mask */
866 	 0x0,                         /* dst_mask */
867 	 TRUE),                       /* pcrel_offset */
868 
869   /* 62: IRELATIVE*/
870   HOWTO (R_CKCORE_IRELATIVE,0,0,0,0,0,0,0,"R_CKCORE_IRELATIVE",0,0,0,0),
871 
872   /* 63: for bloop instruction */
873   HOWTO (R_CKCORE_PCREL_BLOOP_IMM4BY4, /* type */
874 	 1,                           /* rightshift */
875 	 2,                           /* size */
876 	 4,                           /* bitsize */
877 	 1,                           /* pc_relative */
878 	 0,                           /* bitpos */
879 	 complain_overflow_signed,    /* complain_on_overflow */
880 	 bfd_elf_generic_reloc,       /* special_function */
881 	 "R_CKCORE_PCREL_BLOOP_IMM4BY4", /* name */
882 	 FALSE,                       /* partial_inplace */
883 	 0x0,                         /* src_mask */
884 	 0xf,                         /* dst_mask */
885 	 TRUE),                       /* pcrel_offset */
886   /* 64: for bloop instruction */
887   HOWTO (R_CKCORE_PCREL_BLOOP_IMM12BY4, /* type */
888 	 1,                           /* rightshift */
889 	 2,                           /* size */
890 	 12,                          /* bitsize */
891 	 1,                           /* pc_relative */
892 	 0,                           /* bitpos */
893 	 complain_overflow_signed,    /* complain_on_overflow */
894 	 bfd_elf_generic_reloc,       /* special_function */
895 	 "R_CKCORE_PCREL_BLOOP_IMM12BY4", /* name */
896 	 FALSE,                       /* partial_inplace */
897 	 0x0,                         /* src_mask */
898 	 0xfff,                       /* dst_mask */
899 	 TRUE),                       /* pcrel_offset */
900 
901 
902 };
903 
904 
905 /* Whether GOT overflow checking is needed.  */
906 static int check_got_overflow = 0;
907 
908 /* Whether the target 32 bits is forced so that the high
909    16 bits is at the low address.  */
910 static int need_reverse_bits;
911 
912 /* Used for relaxation.  See csky_relocate_contents.  */
913 static bfd_vma read_content_substitute;
914 
915 /* NOTICE!
916    The way the following two look-up functions work demands
917    that BFD_RELOC_CKCORE_xxx are defined contiguously.  */
918 
919 static reloc_howto_type *
920 csky_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
921 			    bfd_reloc_code_real_type code)
922 {
923   int csky_code = code - BFD_RELOC_CKCORE_NONE;
924 
925   if (csky_code < 0 || csky_code >= R_CKCORE_MAX)
926     {
927       switch (code)
928 	{
929 	case BFD_RELOC_NONE:
930 	  csky_code = R_CKCORE_NONE;
931 	  break;
932 	case BFD_RELOC_32:
933 	  csky_code = R_CKCORE_ADDR32;
934 	  break;
935 	case BFD_RELOC_32_PCREL:
936 	  csky_code = R_CKCORE_PCREL32;
937 	  break;
938 	case BFD_RELOC_VTABLE_INHERIT:
939 	  csky_code = R_CKCORE_GNU_VTINHERIT;
940 	  break;
941 	case BFD_RELOC_VTABLE_ENTRY:
942 	  csky_code = R_CKCORE_GNU_VTENTRY;
943 	  break;
944 	case BFD_RELOC_RVA:
945 	  csky_code = R_CKCORE_RELATIVE;
946 	  break;
947 	default:
948 	  return (reloc_howto_type *)NULL;
949 	}
950     }
951   /* Note: when adding csky bfd reloc types in bfd-in2.h
952      and csky elf reloc types in elf/csky.h,
953      the order of the two reloc type tables should be consistent.  */
954   return &csky_elf_howto_table[csky_code];
955 }
956 
957 static reloc_howto_type *
958 csky_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
959 			    const char *r_name)
960 {
961   unsigned int i;
962   for (i = 0; i < R_CKCORE_MAX; i++)
963     if (strcasecmp (csky_elf_howto_table[i].name, r_name) == 0)
964       return &csky_elf_howto_table[i];
965   return NULL;
966 }
967 
968 static reloc_howto_type *
969 elf32_csky_howto_from_type (unsigned int r_type)
970 {
971   if (r_type < R_CKCORE_MAX)
972     return &csky_elf_howto_table[r_type];
973   else
974     return NULL;
975 }
976 
977 static bfd_boolean
978 csky_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
979 			arelent *cache_ptr,
980 			Elf_Internal_Rela *dst)
981 {
982   unsigned int r_type;
983 
984   r_type = ELF32_R_TYPE (dst->r_info);
985   cache_ptr->howto = elf32_csky_howto_from_type (r_type);
986   if (cache_ptr->howto == NULL)
987     {
988       /* xgettext:c-format */
989       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
990 			  abfd, r_type);
991       bfd_set_error (bfd_error_bad_value);
992       return FALSE;
993     }
994   return TRUE;
995 }
996 
997 /* The Global Offset Table max size.  */
998 #define GOT_MAX_SIZE 0xFFFF8
999 
1000 /* The name of the dynamic interpreter.  This is put in the .interp
1001    section.  */
1002 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
1003 
1004 /* The size in bytes of an entry in the procedure linkage table.  */
1005 #define PLT_ENTRY_SIZE      12
1006 #define PLT_ENTRY_SIZE_P    16
1007 
1008 /* The first entry in a procedure linkage table looks like
1009    this.  It is set up so that any shared library function that is
1010    called before the relocation has been set up calls the dynamic
1011    linker first.  */
1012 static const bfd_vma csky_elf_plt_entry_v2[PLT_ENTRY_SIZE / 4] =
1013 {
1014   0xd99c2002,  /* ldw r12, (gb, 8)  */
1015   0xea0d0000,  /* movi r13,offset   */
1016   0xe8cc0000   /* jmp r12           */
1017 };
1018 
1019 static const bfd_vma csky_elf_plt_entry_v1[PLT_ENTRY_SIZE / 2 ] =
1020 {
1021   0x25f0,  /* subi r0, 32       */
1022   0x9200,  /* stw r2, (r0, 0)   */
1023   0x9310,  /* stw r3, (r0, 4)   */
1024   0x822e,  /* ldw r2, (gb, 8)   */
1025   0x7301,  /* lrw r3, #offset   */
1026   0x00c2,  /* jmp r2            */
1027 };
1028 
1029 /* Branch stub support.  */
1030 
1031 enum stub_insn_type
1032 {
1033   INSN16,
1034   INSN32,
1035   DATA_TYPE
1036 };
1037 
1038 bfd_boolean use_branch_stub = TRUE;
1039 typedef struct
1040 {
1041   bfd_vma data;
1042   enum stub_insn_type type;
1043   unsigned int r_type;
1044   int reloc_addend;
1045 } insn_sequence;
1046 
1047 static const insn_sequence elf32_csky_stub_long_branch[] =
1048 {
1049   {0xea8d0002, INSN32,    R_CKCORE_NONE,   0x0},   /* lrw t1,[pc+8] */
1050   {0x7834,     INSN16,    R_CKCORE_NONE,   0x0},   /* jmp t1 */
1051   {0x6c03,     INSN16,    R_CKCORE_NONE,   0x0},   /* nop */
1052   {0x0,        DATA_TYPE, R_CKCORE_ADDR32, 0x0}    /* .long addr */
1053 };
1054 
1055 static const insn_sequence elf32_csky_stub_long_branch_jmpi[] =
1056 {
1057   {0xeac00001, INSN32,    R_CKCORE_NONE,   0x0},   /* jmpi [pc+4] */
1058   {0x0,        DATA_TYPE, R_CKCORE_ADDR32, 0x0}    /* .long addr */
1059 };
1060 
1061 /* The bsr instruction offset limit.  */
1062 #define BSR_MAX_FWD_BRANCH_OFFSET       (((1 << 25) - 1) << 1)
1063 #define BSR_MAX_BWD_BRANCH_OFFSET       (-(1 << 26))
1064 
1065 #define STUB_SUFFIX ".stub"
1066 #define STUB_ENTRY_NAME "__%s_veneer"
1067 
1068 /* One entry per long/short branch stub defined above.  */
1069 #define DEF_STUBS \
1070   DEF_STUB(long_branch) \
1071   DEF_STUB(long_branch_jmpi)
1072 
1073 #define DEF_STUB(x) csky_stub_##x,
1074 enum elf32_csky_stub_type
1075 {
1076   csky_stub_none,
1077   DEF_STUBS
1078 };
1079 #undef DEF_STUB
1080 
1081 typedef struct
1082 {
1083   const insn_sequence* template_sequence;
1084   int template_size;
1085 } stub_def;
1086 
1087 #define DEF_STUB(x) {elf32_csky_stub_##x, ARRAY_SIZE(elf32_csky_stub_##x)},
1088 static const stub_def stub_definitions[] = {
1089   {NULL, 0},
1090   DEF_STUBS
1091 };
1092 
1093 /* The size of the thread control block.  */
1094 #define TCB_SIZE        8
1095 
1096 struct csky_elf_obj_tdata
1097 {
1098   struct elf_obj_tdata root;
1099 
1100   /* tls_type for each local got entry.  */
1101   char *local_got_tls_type;
1102 };
1103 
1104 #define csky_elf_local_got_tls_type(bfd) \
1105   (csky_elf_tdata (bfd)->local_got_tls_type)
1106 
1107 #define csky_elf_tdata(bfd) \
1108   ((struct csky_elf_obj_tdata *) (bfd)->tdata.any)
1109 
1110 struct elf32_csky_stub_hash_entry
1111 {
1112   /* Base hash table entry structure.  */
1113   struct bfd_hash_entry root;
1114 
1115   /* The stub section.  */
1116   asection *stub_sec;
1117 
1118   /* Offset within stub_sec of the beginning of this stub.  */
1119   bfd_vma stub_offset;
1120 
1121   /* Given the symbol's value and its section we can determine its final
1122      value when building the stubs (so the stub knows where to jump).  */
1123   bfd_vma target_value;
1124   asection *target_section;
1125 
1126     /* Offset to apply to relocation referencing target_value.  */
1127   bfd_vma target_addend;
1128 
1129   /* The stub type.  */
1130   enum elf32_csky_stub_type stub_type;
1131   /* Its encoding size in bytes.  */
1132   int stub_size;
1133   /* Its template.  */
1134   const insn_sequence *stub_template;
1135   /* The size of the template (number of entries).  */
1136   int stub_template_size;
1137 
1138   /* The symbol table entry, if any, that this was derived from.  */
1139   struct csky_elf_link_hash_entry *h;
1140 
1141   /* Destination symbol type.  */
1142   unsigned char st_type;
1143 
1144   /* Where this stub is being called from, or, in the case of combined
1145      stub sections, the first input section in the group.  */
1146   asection *id_sec;
1147 
1148   /* The name for the local symbol at the start of this stub.  The
1149      stub name in the hash table has to be unique; this does not, so
1150      it can be friendlier.  */
1151   char *output_name;
1152 };
1153 
1154 #define csky_stub_hash_lookup(table, string, create, copy) \
1155   ((struct elf32_csky_stub_hash_entry *) \
1156    bfd_hash_lookup ((table), (string), (create), (copy)))
1157 
1158 /* C-SKY ELF linker hash entry.  */
1159 struct csky_elf_link_hash_entry
1160 {
1161   struct elf_link_hash_entry elf;
1162   int plt_refcount;
1163   /* For sub jsri2bsr relocs count.  */
1164   int jsri2bsr_refcount;
1165   /* Track dynamic relocs copied for this symbol.  */
1166   struct elf_dyn_relocs *dyn_relocs;
1167 
1168 #define GOT_UNKNOWN     0
1169 #define GOT_NORMAL      1
1170 #define GOT_TLS_GD      2
1171 #define GOT_TLS_IE      4
1172 
1173   unsigned char tls_type;
1174 
1175   /* A pointer to the most recently used stub hash entry against this
1176      symbol.  */
1177   struct elf32_csky_stub_hash_entry *stub_cache;
1178 };
1179 
1180 /* Traverse an C-SKY ELF linker hash table.  */
1181 #define csky_elf_link_hash_traverse(table, func, info)                     \
1182   (elf_link_hash_traverse                                                  \
1183    (&(table)->root,                                                        \
1184     (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
1185     (info)))
1186 
1187 /* Get the C-SKY ELF linker hash table from a link_info structure.  */
1188 #define csky_elf_hash_table(info) \
1189   ((elf_hash_table_id  ((struct elf_link_hash_table *) ((info)->hash))	\
1190     == CSKY_ELF_DATA)							\
1191    ? ((struct csky_elf_link_hash_table *) ((info)->hash))		\
1192    : NULL)
1193 
1194 #define csky_elf_hash_entry(ent)  ((struct csky_elf_link_hash_entry*)(ent))
1195 
1196 /* Array to keep track of which stub sections have been created, and
1197    information on stub grouping.  */
1198 struct map_stub
1199 {
1200   /* This is the section to which stubs in the group will be
1201      attached.  */
1202   asection *link_sec;
1203   /* The stub section.  */
1204   asection *stub_sec;
1205 };
1206 
1207 /* C-SKY ELF linker hash table.  */
1208 struct csky_elf_link_hash_table
1209 {
1210   struct elf_link_hash_table elf;
1211 
1212   /* Small local sym cache.  */
1213   struct sym_cache sym_cache;
1214 
1215   /* Data for R_CKCORE_TLS_LDM32 relocations.  */
1216   union
1217   {
1218     bfd_signed_vma refcount;
1219     bfd_vma offset;
1220   } tls_ldm_got;
1221 
1222   /* The stub hash table.  */
1223   struct bfd_hash_table stub_hash_table;
1224 
1225   /* Linker stub bfd.  */
1226   bfd *stub_bfd;
1227 
1228   /* Linker call-backs.  */
1229   asection * (*add_stub_section) (const char *, asection *);
1230   void (*layout_sections_again) (void);
1231 
1232   /* Array to keep track of which stub sections have been created, and
1233    * information on stub grouping.  */
1234   struct map_stub *stub_group;
1235 
1236   /* Number of elements in stub_group.  */
1237   unsigned int top_id;
1238 
1239   /* Assorted information used by elf32_csky_size_stubs.  */
1240   unsigned int bfd_count;
1241   unsigned int top_index;
1242   asection **input_list;
1243 };
1244 
1245 /* We can't change vectors in the bfd target which will apply to
1246    data sections, however we only do this to the text sections.  */
1247 
1248 static bfd_vma
1249 csky_get_insn_32 (bfd *input_bfd,
1250 		  bfd_byte *location)
1251 {
1252   if (bfd_big_endian (input_bfd))
1253     return bfd_get_32 (input_bfd, location);
1254   else
1255     return (bfd_get_16 (input_bfd, location) << 16
1256 	    | bfd_get_16 (input_bfd, location + 2));
1257 }
1258 
1259 static void
1260 csky_put_insn_32 (bfd *input_bfd,
1261 		  bfd_vma x,
1262 		  bfd_byte *location)
1263 {
1264   if (bfd_big_endian (input_bfd))
1265     bfd_put_32 (input_bfd, x, location);
1266   else
1267     {
1268       bfd_put_16 (input_bfd, x >> 16, location);
1269       bfd_put_16 (input_bfd, x & 0xffff, location + 2);
1270     }
1271 }
1272 
1273 /* Find or create a stub section.  Returns a pointer to the stub section, and
1274    the section to which the stub section will be attached (in *LINK_SEC_P).
1275    LINK_SEC_P may be NULL.  */
1276 
1277 static asection *
1278 elf32_csky_create_or_find_stub_sec (asection **link_sec_p, asection *section,
1279 				    struct csky_elf_link_hash_table *htab)
1280 {
1281   asection *link_sec;
1282   asection *stub_sec;
1283 
1284   link_sec = htab->stub_group[section->id].link_sec;
1285   stub_sec = htab->stub_group[section->id].stub_sec;
1286   if (stub_sec == NULL)
1287     {
1288       stub_sec = htab->stub_group[link_sec->id].stub_sec;
1289       if (stub_sec == NULL)
1290 	{
1291 	  size_t namelen;
1292 	  bfd_size_type len;
1293 	  char *s_name;
1294 
1295 	  namelen = strlen (link_sec->name);
1296 	  len = namelen + sizeof (STUB_SUFFIX);
1297 	  s_name = bfd_alloc (htab->stub_bfd, len);
1298 	  if (s_name == NULL)
1299 	    return NULL;
1300 
1301 	  memcpy (s_name, link_sec->name, namelen);
1302 	  memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
1303 	  stub_sec = (*htab->add_stub_section) (s_name, link_sec);
1304 	  if (stub_sec == NULL)
1305 	    return NULL;
1306 	  htab->stub_group[link_sec->id].stub_sec = stub_sec;
1307 	}
1308       htab->stub_group[section->id].stub_sec = stub_sec;
1309     }
1310 
1311   if (link_sec_p)
1312     *link_sec_p = link_sec;
1313 
1314   return stub_sec;
1315 }
1316 
1317 /* Build a name for an entry in the stub hash table.  */
1318 
1319 static char *
1320 elf32_csky_stub_name (const asection *input_section,
1321 		      const asection *sym_sec,
1322 		      const struct csky_elf_link_hash_entry *hash,
1323 		      const Elf_Internal_Rela *rel)
1324 {
1325   char *stub_name;
1326   bfd_size_type len;
1327 
1328   if (hash)
1329     {
1330       len = 8 + 1 + strlen (hash->elf.root.root.string) + 1 + 8 + 1;
1331       stub_name = bfd_malloc (len);
1332       if (stub_name != NULL)
1333 	sprintf (stub_name, "%08x_%s+%x",
1334 		 input_section->id & 0xffffffff,
1335 		 hash->elf.root.root.string,
1336 		 (int) rel->r_addend & 0xffffffff);
1337     }
1338   else
1339     {
1340       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
1341       stub_name = bfd_malloc (len);
1342       if (stub_name != NULL)
1343 	sprintf (stub_name, "%08x_%x:%x+%x",
1344 		 input_section->id & 0xffffffff,
1345 		 sym_sec->id & 0xffffffff,
1346 		 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
1347 		 (int) rel->r_addend & 0xffffffff);
1348     }
1349 
1350   return stub_name;
1351 }
1352 
1353 /* Determine the type of stub needed, if any, for a call.  */
1354 
1355 static enum elf32_csky_stub_type
1356 csky_type_of_stub (struct bfd_link_info *info,
1357 		   asection *input_sec,
1358 		   const Elf_Internal_Rela *rel,
1359 		   unsigned char st_type,
1360 		   struct csky_elf_link_hash_entry *hash,
1361 		   bfd_vma destination,
1362 		   asection *sym_sec ATTRIBUTE_UNUSED,
1363 		   bfd *input_bfd ATTRIBUTE_UNUSED,
1364 		   const char *name ATTRIBUTE_UNUSED)
1365 {
1366   bfd_vma location;
1367   bfd_signed_vma branch_offset;
1368   unsigned int r_type;
1369   enum elf32_csky_stub_type stub_type = csky_stub_none;
1370   struct elf_link_hash_entry * h = &hash->elf;
1371 
1372   /* We don't know the actual type of destination in case it is of
1373      type STT_SECTION: give up.  */
1374   if (st_type == STT_SECTION)
1375     return stub_type;
1376 
1377   location = (input_sec->output_offset
1378 	      + input_sec->output_section->vma
1379 	      + rel->r_offset);
1380 
1381   branch_offset = (bfd_signed_vma)(destination - location);
1382   r_type = ELF32_R_TYPE (rel->r_info);
1383   if (r_type == R_CKCORE_PCREL_IMM26BY2
1384       && ((h != NULL
1385 	   && ((h->def_dynamic && !h->def_regular)
1386 	       || (bfd_link_pic (info)
1387 		   && h->root.type == bfd_link_hash_defweak)))
1388 	  || branch_offset > BSR_MAX_FWD_BRANCH_OFFSET
1389 	  || branch_offset < BSR_MAX_BWD_BRANCH_OFFSET))
1390     {
1391       if (bfd_csky_arch (info->output_bfd) == CSKY_ARCH_810
1392 	  || bfd_csky_arch (info->output_bfd) ==  CSKY_ARCH_807)
1393 	stub_type = csky_stub_long_branch_jmpi;
1394       else
1395 	stub_type = csky_stub_long_branch;
1396     }
1397 
1398   return stub_type;
1399 }
1400 
1401 /* Create an entry in an C-SKY ELF linker hash table.  */
1402 
1403 static struct bfd_hash_entry *
1404 csky_elf_link_hash_newfunc (struct bfd_hash_entry * entry,
1405 			    struct bfd_hash_table * table,
1406 			    const char * string)
1407 {
1408   struct csky_elf_link_hash_entry * ret =
1409       (struct csky_elf_link_hash_entry *) entry;
1410 
1411   /* Allocate the structure if it has not already been allocated by a
1412      subclass.  */
1413   if (ret == NULL)
1414     {
1415       ret = (struct csky_elf_link_hash_entry *)
1416 	bfd_hash_allocate (table,
1417 			   sizeof (struct csky_elf_link_hash_entry));
1418       if (ret == NULL)
1419 	return (struct bfd_hash_entry *) ret;
1420     }
1421 
1422   /* Call the allocation method of the superclass.  */
1423   ret = ((struct csky_elf_link_hash_entry *)
1424 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *)ret,
1425 				     table, string));
1426   if (ret != NULL)
1427     {
1428       struct csky_elf_link_hash_entry *eh;
1429 
1430       eh = (struct csky_elf_link_hash_entry *) ret;
1431       eh->dyn_relocs = NULL;
1432       eh->plt_refcount = 0;
1433       eh->jsri2bsr_refcount = 0;
1434       eh->tls_type = GOT_NORMAL;
1435       ret->stub_cache = NULL;
1436     }
1437 
1438   return (struct bfd_hash_entry *) ret;
1439 }
1440 
1441 /* Initialize an entry in the stub hash table.  */
1442 
1443 static struct bfd_hash_entry *
1444 stub_hash_newfunc (struct bfd_hash_entry *entry,
1445 		   struct bfd_hash_table *table,
1446 		   const char *string)
1447 {
1448   /* Allocate the structure if it has not already been allocated by a
1449      subclass.  */
1450   if (entry == NULL)
1451     {
1452       entry = ((struct bfd_hash_entry *)
1453 	       bfd_hash_allocate (table,
1454 				  sizeof (struct elf32_csky_stub_hash_entry)));
1455       if (entry == NULL)
1456 	return entry;
1457     }
1458 
1459   /* Call the allocation method of the superclass.  */
1460   entry = bfd_hash_newfunc (entry, table, string);
1461   if (entry != NULL)
1462     {
1463       struct elf32_csky_stub_hash_entry *eh;
1464 
1465       /* Initialize the local fields.  */
1466       eh = (struct elf32_csky_stub_hash_entry *) entry;
1467       eh->stub_sec = NULL;
1468       eh->stub_offset = 0;
1469       eh->target_value = 0;
1470       eh->target_section = NULL;
1471       eh->target_addend = 0;
1472       eh->stub_type = csky_stub_none;
1473       eh->stub_size = 0;
1474       eh->stub_template = NULL;
1475       eh->stub_template_size = -1;
1476       eh->h = NULL;
1477       eh->id_sec = NULL;
1478       eh->output_name = NULL;
1479     }
1480 
1481   return entry;
1482 }
1483 
1484 /* Free the derived linker hash table.  */
1485 
1486 static void
1487 csky_elf_link_hash_table_free (bfd *obfd)
1488 {
1489   struct csky_elf_link_hash_table *ret
1490     = (struct csky_elf_link_hash_table *) obfd->link.hash;
1491 
1492   bfd_hash_table_free (&ret->stub_hash_table);
1493   _bfd_elf_link_hash_table_free (obfd);
1494 }
1495 
1496 /* Create an CSKY elf linker hash table.  */
1497 
1498 static struct bfd_link_hash_table *
1499 csky_elf_link_hash_table_create (bfd *abfd)
1500 {
1501   struct csky_elf_link_hash_table *ret;
1502   bfd_size_type amt = sizeof (struct csky_elf_link_hash_table);
1503 
1504   ret = (struct csky_elf_link_hash_table*) bfd_zmalloc (amt);
1505   if (ret == NULL)
1506     return NULL;
1507 
1508   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1509 				      csky_elf_link_hash_newfunc,
1510 				      sizeof (struct csky_elf_link_hash_entry),
1511 				      CSKY_ELF_DATA))
1512     {
1513       free (ret);
1514       return NULL;
1515     }
1516 
1517   if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
1518 			    sizeof (struct elf32_csky_stub_hash_entry)))
1519     {
1520       free (ret);
1521       return NULL;
1522     }
1523   ret->elf.root.hash_table_free = csky_elf_link_hash_table_free;
1524   return &ret->elf.root;
1525 }
1526 
1527 static bfd_boolean
1528 csky_elf_mkobject (bfd *abfd)
1529 {
1530   return bfd_elf_allocate_object (abfd, sizeof (struct csky_elf_obj_tdata),
1531 				  CSKY_ELF_DATA);
1532 }
1533 
1534 /* Adjust a symbol defined by a dynamic object and referenced by a
1535    regular object.  The current definition is in some section of the
1536    dynamic object, but we're not including those sections.  We have to
1537    change the definition to something the rest of the link can
1538    understand.  */
1539 
1540 static bfd_boolean
1541 csky_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1542 				struct elf_link_hash_entry *h)
1543 {
1544   struct csky_elf_link_hash_entry *eh;
1545   struct csky_elf_link_hash_table *htab;
1546   asection *srel;
1547   asection *s;
1548   eh = (struct csky_elf_link_hash_entry *)h;
1549   if (eh == NULL)
1550     return FALSE;
1551 
1552   htab = csky_elf_hash_table (info);
1553   if (htab == NULL)
1554     return FALSE;
1555 
1556   /* Clear jsri2bsr_refcount, if creating shared library files.  */
1557   if (bfd_link_pic (info) && eh->jsri2bsr_refcount > 0)
1558     eh->jsri2bsr_refcount = 0;
1559 
1560   /* If there is a function, put it in the procedure linkage table. We
1561      will fill in the contents of the procedure linkage table later.  */
1562   if (h->needs_plt)
1563     {
1564       /* Calls to STT_GNU_IFUNC symbols always use a PLT, even if the
1565 	 symbol binds locally.  */
1566       if (h->plt.refcount <= 0
1567 	  || (h->type != STT_GNU_IFUNC
1568 	      && (SYMBOL_CALLS_LOCAL (info, h)
1569 		  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1570 		      && h->root.type == bfd_link_hash_undefweak))))
1571 
1572 	{
1573 	  /* This case can occur if we saw a PLT32 reloc in an input
1574 	     file, but the symbol was never referred to by a dynamic
1575 	     object, or if all references were garbage collected.  In
1576 	     such a case, we don't actually need to build a procedure
1577 	     linkage table, and we can just do a PC32 reloc instead.  */
1578 	  h->plt.offset = (bfd_vma) -1;
1579 	  h->needs_plt = 0;
1580 	  if (h->got.refcount == 0)
1581 	    h->got.refcount += 1;
1582 	}
1583       else if (h->got.refcount != 0)
1584 	{
1585 	  h->got.refcount -= eh->plt_refcount;
1586 	  eh->plt_refcount = 0;
1587 	}
1588       return TRUE;
1589     }
1590   else
1591     /* It's possible that we incorrectly decided a .plt reloc was
1592        needed for an R_CKCORE_PC32 or similar reloc to a non-function
1593        sym in check_relocs.  We can't decide accurately between function
1594        and non-function syms in check_relocs; objects loaded later in
1595        the link may change h->type.  So fix it now.  */
1596     h->plt.offset = (bfd_vma) -1;
1597 
1598   /* If this is a weak symbol, and there is a real definition, the
1599      processor independent code will have arranged for us to see the
1600      real definition first, and we can just use the same value.  */
1601   if (h->is_weakalias)
1602     {
1603       struct elf_link_hash_entry *def = weakdef (h);
1604       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1605       h->root.u.def.section = def->root.u.def.section;
1606       h->root.u.def.value = def->root.u.def.value;
1607       return TRUE;
1608     }
1609 
1610   /* If there are no non-GOT references, we do not need a copy
1611      relocation.  */
1612   if (!h->non_got_ref)
1613     return TRUE;
1614 
1615   /* This is a reference to a symbol defined by a dynamic object which
1616      is not a function.  */
1617 
1618   /* If we are creating a shared library, we must presume that the
1619      only references to the symbol are via the global offset table.
1620      For such cases we need not do anything here; the relocations will
1621      be handled correctly by relocate_section.  */
1622   if (bfd_link_pic (info) || htab->elf.is_relocatable_executable)
1623     return TRUE;
1624 
1625   /* We must allocate the symbol in our .dynbss section, which will
1626      become part of the .bss section of the executable.  There will be
1627      an entry for this symbol in the .dynsym section.  The dynamic
1628      object will contain position independent code, so all references
1629      from the dynamic object to this symbol will go through the global
1630      offset table.  The dynamic linker will use the .dynsym entry to
1631      determine the address it must put in the global offset table, so
1632      both the dynamic object and the regular object will refer to the
1633      same memory location for the variable.  */
1634   /* We must generate a R_CKCORE_COPY reloc to tell the dynamic linker to
1635      copy the initial value out of the dynamic object and into the
1636      runtime process image.  We need to remember the offset into the
1637      .rela.bss section we are going to use.  */
1638   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
1639     {
1640       s = htab->elf.sdynrelro;
1641       srel = htab->elf.sreldynrelro;
1642     }
1643   else
1644     {
1645       s = htab->elf.sdynbss;
1646       srel = htab->elf.srelbss;
1647     }
1648   if (info->nocopyreloc == 0
1649       && (h->root.u.def.section->flags & SEC_ALLOC) != 0
1650       && h->size != 0
1651       && srel != NULL
1652       && s != NULL)
1653     {
1654       srel->size += sizeof (Elf32_External_Rela);
1655       h->needs_copy = 1;
1656       return _bfd_elf_adjust_dynamic_copy (info, h, s);
1657     }
1658 
1659   h->non_got_ref = 0;
1660   return TRUE;
1661 }
1662 
1663 /* Allocate space in .plt, .got and associated reloc sections for
1664    dynamic relocs.  */
1665 
1666 static bfd_boolean
1667 csky_allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
1668 {
1669   struct bfd_link_info *info;
1670   struct csky_elf_link_hash_table *htab;
1671   struct csky_elf_link_hash_entry *eh;
1672   struct elf_dyn_relocs *p;
1673 
1674   /* For indirect case, such as _ZdlPv to _ZdlPv@@GLIBCXX_3.4.  */
1675   if (h->root.type == bfd_link_hash_indirect)
1676     return TRUE;
1677 
1678   if (h->root.type == bfd_link_hash_warning)
1679     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1680 
1681 
1682   info = (struct bfd_link_info *) inf;
1683   htab = csky_elf_hash_table (info);
1684   if (htab == NULL)
1685     return FALSE;
1686   /*TODO: how to deal with weak symbol relocs.  */
1687   if ((htab->elf.dynamic_sections_created || h->type == STT_GNU_IFUNC)
1688       && h->plt.refcount > 0)
1689     {
1690       /* Make sure this symbol is output as a dynamic symbol.
1691 	 Undefined weak syms won't yet be marked as dynamic.  */
1692       if (h->dynindx == -1 && !h->forced_local
1693 	  && h->root.type == bfd_link_hash_undefweak
1694 	  && ! bfd_elf_link_record_dynamic_symbol (info, h))
1695 	return FALSE;
1696       if (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1697 	{
1698 	  asection *splt = htab->elf.splt;
1699 
1700 	  /* If this is the first .plt entry, make room for the special
1701 	     first entry.  */
1702 	  if (splt->size == 0)
1703 	    {
1704 	      if (bfd_csky_abi (info->output_bfd) ==  CSKY_ABI_V1)
1705 		splt->size += PLT_ENTRY_SIZE_P;
1706 	      else
1707 		splt->size += PLT_ENTRY_SIZE;
1708 	    }
1709 	  h->plt.offset = splt->size;
1710 
1711 	  /* If this symbol is not defined in a regular file, and we are
1712 	     not generating a shared library, then set the symbol to this
1713 	     location in the .plt.  This is required to make function
1714 	     pointers compare as equal between the normal executable and
1715 	     the shared library.  */
1716 	  if (!bfd_link_pic (info) && !h->def_regular)
1717 	    {
1718 	      h->root.u.def.section = splt;
1719 	      h->root.u.def.value = h->plt.offset;
1720 	    }
1721 
1722 	  /* Make room for this entry.  */
1723 	  if (bfd_csky_abi (info->output_bfd) ==  CSKY_ABI_V1)
1724 	    splt->size += PLT_ENTRY_SIZE_P;
1725 	  else
1726 	    splt->size += PLT_ENTRY_SIZE;
1727 	  /* We also need to make an entry in the .rela.plt section.  */
1728 	  htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
1729 
1730 	  /* We also need to make an entry in the .got.plt section, which
1731 	     will be placed in the .got section by the linker script.  */
1732 	  htab->elf.sgotplt->size += 4;
1733 	}
1734       else
1735 	{
1736 	  h->plt.offset = (bfd_vma) -1;
1737 	  h->needs_plt = 0;
1738 	}
1739     }
1740   else
1741     {
1742       h->plt.offset = (bfd_vma) -1;
1743       h->needs_plt = 0;
1744     }
1745 
1746   if (h->got.refcount > 0)
1747     {
1748       asection *sgot;
1749       bfd_boolean dyn;
1750       int indx;
1751 
1752       int tls_type = csky_elf_hash_entry (h)->tls_type;
1753       /* Make sure this symbol is output as a dynamic symbol.
1754 	 Undefined weak syms won't yet be marked as dynamic.  */
1755       if (h->dynindx == -1 && !h->forced_local
1756 	  && h->root.type == bfd_link_hash_undefweak
1757 	  && ! bfd_elf_link_record_dynamic_symbol (info, h))
1758 	return FALSE;
1759 
1760       sgot = htab->elf.sgot;
1761       h->got.offset = sgot->size;
1762       BFD_ASSERT (tls_type != GOT_UNKNOWN);
1763       if (tls_type == GOT_NORMAL)
1764 	/* Non-TLS symbols need one GOT slot.  */
1765 	sgot->size += 4;
1766       else
1767 	{
1768 	  if (tls_type & GOT_TLS_GD)
1769 	    /* R_CKCORE_TLS_GD32 needs 2 consecutive GOT slots.  */
1770 	    sgot->size += 8;
1771 	  if (tls_type & GOT_TLS_IE)
1772 	    /* R_CKCORE_TLS_IE32 needs one GOT slot.  */
1773 	    sgot->size += 4;
1774 	}
1775       dyn = htab->elf.dynamic_sections_created;
1776       indx = 0;
1777       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
1778 	  && (! bfd_link_pic (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
1779 	indx = h->dynindx;
1780 
1781       if (tls_type != GOT_NORMAL
1782 	  && (bfd_link_pic (info) || indx != 0)
1783 	  && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1784 	       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1785 	      || h->root.type != bfd_link_hash_undefweak))
1786 	{
1787 	  if (tls_type & GOT_TLS_IE)
1788 	    htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
1789 	  if (tls_type & GOT_TLS_GD)
1790 	    htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
1791 	  if ((tls_type & GOT_TLS_GD) && indx != 0)
1792 	    htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
1793 	}
1794       else if (((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1795 		 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1796 		|| h->root.type != bfd_link_hash_undefweak)
1797 	       && (bfd_link_pic (info)
1798 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)
1799 		   || h->plt.offset == (bfd_vma) -1))
1800 	htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
1801     }
1802   else
1803     h->got.offset = (bfd_vma) -1;
1804 
1805   eh = (struct csky_elf_link_hash_entry *) h;
1806   if (eh->dyn_relocs == NULL)
1807     return TRUE;
1808 
1809   /* In the shared -Bsymbolic case, discard space allocated for
1810      dynamic pc-relative relocs against symbols which turn out to be
1811      defined in regular objects.  For the normal shared case, discard
1812      space for pc-relative relocs that have become local due to symbol
1813      visibility changes.  */
1814 
1815   if (bfd_link_pic (info))
1816     {
1817       if (SYMBOL_CALLS_LOCAL (info, h))
1818 	{
1819 	  struct elf_dyn_relocs **pp;
1820 
1821 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1822 	    {
1823 	      p->count -= p->pc_count;
1824 	      p->pc_count = 0;
1825 	      if (p->count == 0)
1826 		*pp = p->next;
1827 	      else
1828 		pp = &p->next;
1829 	    }
1830 	}
1831 
1832       if (eh->jsri2bsr_refcount
1833 	  && h->root.type == bfd_link_hash_defined
1834 	  && eh->dyn_relocs != NULL)
1835 	eh->dyn_relocs->count -= eh->jsri2bsr_refcount;
1836 
1837       /* Also discard relocs on undefined weak syms with non-default
1838 	 visibility.  */
1839       if (eh->dyn_relocs != NULL
1840 	  && h->root.type == bfd_link_hash_undefweak)
1841 	{
1842 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1843 	      || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
1844 	    eh->dyn_relocs = NULL;
1845 
1846 	  /* Make sure undefined weak symbols are output as a dynamic
1847 	     symbol in PIEs.  */
1848 	  else if (h->dynindx == -1
1849 		   && !h->forced_local
1850 		   && !bfd_elf_link_record_dynamic_symbol (info, h))
1851 	    return FALSE;
1852 	}
1853 
1854     }
1855   else
1856     {
1857       /* For the non-shared case, discard space for relocs against
1858 	 symbols which turn out to need copy relocs or are not
1859 	 dynamic.  */
1860 
1861       if (!h->non_got_ref
1862 	  && ((h->def_dynamic && !h->def_regular)
1863 	      || (htab->elf.dynamic_sections_created
1864 		  && (h->root.type == bfd_link_hash_undefweak
1865 		      || h->root.type == bfd_link_hash_indirect
1866 		      || h->root.type == bfd_link_hash_undefined))))
1867 	{
1868 	  /* Make sure this symbol is output as a dynamic symbol.
1869 	     Undefined weak syms won't yet be marked as dynamic.  */
1870 	  if (h->dynindx == -1 && !h->forced_local
1871 	      && h->root.type == bfd_link_hash_undefweak)
1872 	    {
1873 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
1874 		return FALSE;
1875 	    }
1876 
1877 	  /* If that succeeded, we know we'll be keeping all the
1878 	     relocs.  */
1879 	  if (h->dynindx != -1)
1880 	    goto keep;
1881 	}
1882 
1883       eh->dyn_relocs = NULL;
1884 
1885       keep: ;
1886     }
1887 
1888   /* Finally, allocate space.  */
1889   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1890     {
1891       asection *srelgot = htab->elf.srelgot;
1892       srelgot->size += p->count * sizeof (Elf32_External_Rela);
1893     }
1894 
1895   return TRUE;
1896 }
1897 
1898 static asection *
1899 readonly_dynrelocs (struct elf_link_hash_entry *h)
1900 {
1901   struct elf_dyn_relocs *p;
1902 
1903   for (p = csky_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
1904     {
1905       asection *s = p->sec->output_section;
1906 
1907       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1908 	return p->sec;
1909     }
1910   return NULL;
1911 }
1912 
1913 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
1914    read-only sections.  */
1915 
1916 static bfd_boolean
1917 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
1918 {
1919   asection *sec;
1920 
1921   if (h->root.type == bfd_link_hash_indirect)
1922     return TRUE;
1923 
1924   sec = readonly_dynrelocs (h);
1925   if (sec != NULL)
1926     {
1927       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
1928 
1929       info->flags |= DF_TEXTREL;
1930       info->callbacks->minfo
1931 	(_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
1932 	 sec->owner, h->root.root.string, sec);
1933 
1934       /* Not an error, just cut short the traversal.  */
1935       return FALSE;
1936     }
1937   return TRUE;
1938 }
1939 
1940 /* Set the sizes of the dynamic sections.  */
1941 
1942 static bfd_boolean
1943 csky_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1944 				struct bfd_link_info *info)
1945 {
1946   struct csky_elf_link_hash_table *htab;
1947   bfd *dynobj;
1948   asection *s;
1949   bfd_boolean relocs;
1950   bfd *ibfd;
1951 
1952   htab = csky_elf_hash_table (info);
1953   if (htab == NULL)
1954     return FALSE;
1955   dynobj = htab->elf.dynobj;
1956   if (dynobj == NULL)
1957     return FALSE;
1958 
1959   if (htab->elf.dynamic_sections_created)
1960     {
1961       /* Set the contents of the .interp section to the interpreter.  */
1962       if (!bfd_link_pic (info) && !info->nointerp)
1963 	{
1964 	  s = bfd_get_section_by_name (dynobj, ".interp");
1965 	  BFD_ASSERT (s != NULL);
1966 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1967 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1968 	}
1969     }
1970 
1971   /* Set up .got offsets for local syms, and space for local dynamic
1972      relocs.  */
1973   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
1974     {
1975       bfd_signed_vma *local_got_refcounts;
1976       bfd_signed_vma *end_local_got;
1977       bfd_size_type locsymcount;
1978       Elf_Internal_Shdr *symtab_hdr;
1979       asection *srelgot, *sgot;
1980       char *local_tls_type;
1981 
1982       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1983 	continue;
1984 
1985       sgot = htab->elf.sgot;
1986       srelgot = htab->elf.srelgot;
1987 
1988       for (s = ibfd->sections; s != NULL; s = s->next)
1989 	{
1990 	  struct elf_dyn_relocs *p;
1991 
1992 	  for (p = *((struct elf_dyn_relocs **)
1993 		     &elf_section_data (s)->local_dynrel);
1994 	       p != NULL;
1995 	       p = p->next)
1996 	    {
1997 	      if (!bfd_is_abs_section (p->sec)
1998 		  && bfd_is_abs_section (p->sec->output_section))
1999 		/* Input section has been discarded, either because
2000 		   it is a copy of a linkonce section or due to
2001 		   linker script /DISCARD/, so we'll be discarding
2002 		   the relocs too.  */
2003 		;
2004 	      else if (p->count != 0)
2005 		{
2006 		  srelgot->size += p->count * sizeof (Elf32_External_Rela);
2007 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2008 		    info->flags |= DF_TEXTREL;
2009 		}
2010 	    }
2011 	}
2012 
2013       local_got_refcounts = elf_local_got_refcounts (ibfd);
2014       if (!local_got_refcounts)
2015 	continue;
2016 
2017       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2018       locsymcount = symtab_hdr->sh_info;
2019       end_local_got = local_got_refcounts + locsymcount;
2020       local_tls_type = csky_elf_local_got_tls_type (ibfd);
2021 
2022       for (; local_got_refcounts < end_local_got;
2023 	   ++local_got_refcounts, ++local_tls_type)
2024 	{
2025 	  if (*local_got_refcounts > 0)
2026 	    {
2027 	      /* GOT_TLS_GD and GOT_TLS_IE type for TLS, GOT_NORMAL type
2028 		 for GOT.  If output file is shared library, we should output
2029 		 GOT_TLS_GD type relocation in .rel.got.  */
2030 	      *local_got_refcounts = sgot->size;
2031 	      if (*local_tls_type & GOT_TLS_GD)
2032 		/* TLS_GD relocs need an 8-byte structure in the GOT.  */
2033 		sgot->size += 8;
2034 	      if (*local_tls_type & GOT_TLS_IE)
2035 		sgot->size += 4;
2036 	      if (*local_tls_type == GOT_NORMAL)
2037 		sgot->size += 4;
2038 	      if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD)
2039 		srelgot->size += sizeof (Elf32_External_Rela);
2040 	    }
2041 	  else
2042 	    *local_got_refcounts = (bfd_vma) -1;
2043 	}
2044     }
2045 
2046   if (htab->tls_ldm_got.refcount > 0)
2047     {
2048       /* Allocate two GOT entries and one dynamic relocation (if necessary)
2049 	 for R_CSKY_TLS_LDM32 relocations.  */
2050       htab->tls_ldm_got.offset = htab->elf.sgot->size;
2051       htab->elf.sgot->size += 8;
2052       if (bfd_link_pic (info))
2053 	htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
2054     }
2055   else
2056     htab->tls_ldm_got.offset = -1;
2057 
2058   /* Allocate global sym .plt and .got entries, and space for global
2059      sym dynamic relocs.  */
2060   elf_link_hash_traverse (&htab->elf, csky_allocate_dynrelocs, (PTR) info);
2061 
2062   /* Check for GOT overflow.  */
2063   if (check_got_overflow == 1
2064       && htab->elf.sgot->size + htab->elf.sgotplt->size > GOT_MAX_SIZE)
2065     {
2066       _bfd_error_handler (_("GOT table size out of range")); /*  */
2067       return FALSE;
2068     }
2069 
2070   /* We now have determined the sizes of the various dynamic sections.
2071      Allocate memory for them.  */
2072   relocs = FALSE;
2073   for (s = dynobj->sections; s != NULL; s = s->next)
2074     {
2075       bfd_boolean strip_section = TRUE;
2076 
2077       if ((s->flags & SEC_LINKER_CREATED) == 0)
2078 	continue;
2079 
2080       if (s == htab->elf.splt
2081 	  || s == htab->elf.sgot
2082 	  || s == htab->elf.sgotplt
2083 	  || s == htab->elf.sdynrelro
2084 	  || s == htab->elf.sreldynrelro)
2085 	{
2086 	  /* Strip this section if we don't need it;
2087 	     see the comment below.  */
2088 	  /* We'd like to strip these sections if they aren't needed, but if
2089 	     we've exported dynamic symbols from them we must leave them.
2090 	     It's too late to tell BFD to get rid of the symbols.  */
2091 
2092 	  if (htab->elf.hplt != NULL)
2093 	    strip_section = FALSE;
2094 	}
2095       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel") )
2096 	{
2097 	  if (s->size != 0 )
2098 	    relocs = TRUE;
2099 
2100 	  /* We use the reloc_count field as a counter if we need
2101 	     to copy relocs into the output file.  */
2102 	  s->reloc_count = 0;
2103 	}
2104       else
2105 	/* It's not one of our sections, so don't allocate space.  */
2106 	continue;
2107 
2108       /* Strip this section if we don't need it; see the
2109 	 comment below.  */
2110       if (s->size == 0)
2111 	{
2112 	  /* If we don't need this section, strip it from the
2113 	     output file.  This is mostly to handle .rel.bss and
2114 	     .rel.plt.  We must create both sections in
2115 	     create_dynamic_sections, because they must be created
2116 	     before the linker maps input sections to output
2117 	     sections.  The linker does that before
2118 	     adjust_dynamic_symbol is called, and it is that
2119 	     function which decides whether anything needs to go
2120 	     into these sections.  */
2121 	  if (strip_section)
2122 	    s->flags |= SEC_EXCLUDE;
2123 	  continue;
2124 	}
2125 
2126       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2127 	continue;
2128 
2129       /* Allocate memory for the section contents.  We use bfd_zalloc
2130 	 here in case unused entries are not reclaimed before the
2131 	 section's contents are written out.  This should not happen,
2132 	 but this way if it does, we get a R_CKCORE_NONE reloc instead
2133 	 of garbage.  */
2134       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2135       if (s->contents == NULL)
2136 	return FALSE;
2137     }
2138 
2139   if (htab->elf.dynamic_sections_created)
2140     {
2141       /* Add some entries to the .dynamic section.  We fill in the
2142 	 values later, in csky_elf_finish_dynamic_sections, but we
2143 	 must add the entries now so that we get the correct size for
2144 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2145 	 dynamic linker and used by the debugger.  */
2146 #define add_dynamic_entry(TAG, VAL) \
2147   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2148 
2149       if (bfd_link_executable (info) && !add_dynamic_entry (DT_DEBUG, 0))
2150 	return FALSE;
2151 
2152       if (htab->elf.sgot->size != 0 || htab->elf.splt->size)
2153 	{
2154 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
2155 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
2156 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2157 	      || !add_dynamic_entry (DT_JMPREL, 0))
2158 	    return FALSE;
2159 	}
2160 
2161       if (relocs)
2162 	{
2163 	  if (!add_dynamic_entry (DT_RELA, 0)
2164 	      || !add_dynamic_entry (DT_RELASZ, 0)
2165 	      || !add_dynamic_entry (DT_RELAENT,
2166 				     sizeof (Elf32_External_Rela)))
2167 	    return FALSE;
2168 
2169 	  /* If any dynamic relocs apply to a read-only section,
2170 	     then we need a DT_TEXTREL entry.  */
2171 	  if ((info->flags & DF_TEXTREL) == 0)
2172 	    elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
2173 
2174 	  if ((info->flags & DF_TEXTREL) != 0
2175 	      && !add_dynamic_entry (DT_TEXTREL, 0))
2176 	    return FALSE;
2177 	}
2178     }
2179 #undef add_dynamic_entry
2180 
2181   return TRUE;
2182 }
2183 
2184 /* Finish up dynamic symbol handling.  We set the contents of various
2185    dynamic sections here.  */
2186 
2187 static bfd_boolean
2188 csky_elf_finish_dynamic_symbol (bfd *output_bfd,
2189 				struct bfd_link_info *info,
2190 				struct elf_link_hash_entry *h,
2191 				Elf_Internal_Sym *sym)
2192 {
2193   struct csky_elf_link_hash_table *htab;
2194 
2195   htab = csky_elf_hash_table (info);
2196   if (htab == NULL)
2197     return FALSE;
2198 
2199   /* Sanity check to make sure no unexpected symbol reaches here.
2200      This matches the test in csky_elf_relocate_section handling
2201      of GOT/PLT entries.  */
2202   BFD_ASSERT (! (h->dynindx == -1
2203 		 && !h->forced_local
2204 		 && h->root.type != bfd_link_hash_undefweak
2205 		 && bfd_link_pic (info)));
2206 
2207   if (h->plt.offset != (bfd_vma) -1)
2208     {
2209       bfd_vma plt_index;
2210       bfd_vma got_offset;
2211       Elf_Internal_Rela rel;
2212       bfd_byte *loc;
2213       asection *plt, *relplt, *gotplt;
2214 
2215       plt = htab->elf.splt;
2216       relplt = htab->elf.srelplt;
2217       gotplt = htab->elf.sgotplt;
2218 
2219       /* This symbol has an entry in the procedure linkage table.  Set
2220 	 it up.  */
2221       BFD_ASSERT (h->dynindx != -1
2222 		  || ((h->forced_local || bfd_link_executable (info))
2223 		      && h->def_regular));
2224       BFD_ASSERT (plt != NULL && gotplt != NULL && relplt != NULL);
2225       if (bfd_csky_abi (output_bfd) == CSKY_ABI_V2)
2226 	plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
2227       else
2228 	plt_index = h->plt.offset / PLT_ENTRY_SIZE_P - 1;
2229       got_offset = (plt_index + 3) * 4;
2230 
2231       /* Fill in the entry in the procedure linkage table.  */
2232       if (bfd_csky_abi (output_bfd) == CSKY_ABI_V2)
2233 	{
2234 	  csky_put_insn_32 (output_bfd, csky_elf_plt_entry_v2[0],
2235 			    plt->contents + h->plt.offset);
2236 	  csky_put_insn_32 (output_bfd,
2237 			    (csky_elf_plt_entry_v2[1] | plt_index),
2238 			    plt->contents + h->plt.offset + 4);
2239 	  csky_put_insn_32 (output_bfd, csky_elf_plt_entry_v2[2],
2240 			    plt->contents + h->plt.offset + 8);
2241 	}
2242       else
2243 	{
2244 	  int i;
2245 	  for (i = 0; i < 6; i++)
2246 	    bfd_put_16 (output_bfd, csky_elf_plt_entry_v1[i],
2247 			plt->contents + h->plt.offset + i * 2);
2248 	  bfd_put_32 (output_bfd, plt_index,
2249 		      plt->contents + h->plt.offset + i * 2);
2250 	}
2251 
2252       /* Fill in the entry in the .rel.plt section.  */
2253       rel.r_offset = (htab->elf.sgotplt->output_section->vma
2254 		      + htab->elf.sgotplt->output_offset
2255 		      + got_offset);
2256       rel.r_info = ELF32_R_INFO (h->dynindx, R_CKCORE_JUMP_SLOT);
2257       rel.r_addend = (plt->output_section->vma
2258 		      + plt->output_offset
2259 		      + h->plt.offset);
2260       loc = (htab->elf.srelplt->contents
2261 	     + plt_index * sizeof (Elf32_External_Rela));
2262 
2263       if (loc != NULL)
2264 	bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
2265       if (! h->def_regular)
2266 	{
2267 	  /* Mark the symbol as undefined, rather than as defined in
2268 	     the .plt section.  Leave the value alone.  */
2269 	  sym->st_shndx = SHN_UNDEF;
2270 	  /* If the symbol is weak, we do need to clear the value.
2271 	     Otherwise, the PLT entry would provide a definition for
2272 	     the symbol even if the symbol wasn't defined anywhere,
2273 	     and so the symbol would never be NULL. Leave the value if
2274 	     there were any relocations where pointer equality matters
2275 	     (this is a clue for the dynamic linker, to make function
2276 	     pointer comparisons work between an application and shared
2277 	     library).  */
2278 	  if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
2279 	    sym->st_value = 0;
2280 	}
2281     }
2282 
2283   /* Fill in the entry in the .got section.  */
2284   if (h->got.offset != (bfd_vma) -1
2285       && ((csky_elf_hash_entry (h)->tls_type & GOT_TLS_GD) == 0)
2286       && ((csky_elf_hash_entry (h)->tls_type & GOT_TLS_IE) == 0))
2287     {
2288       Elf_Internal_Rela rel;
2289       bfd_byte *loc;
2290 
2291       /* This symbol has an entry in the global offset table.
2292 	 Set it up.  */
2293       BFD_ASSERT (htab->elf.sgot != NULL && htab->elf.srelgot != NULL);
2294 
2295       rel.r_offset = (htab->elf.sgot->output_section->vma
2296 		      + htab->elf.sgot->output_offset
2297 		      + (h->got.offset & ~(bfd_vma) 1));
2298 
2299       /* If this is a static link, or it is a -Bsymbolic link and the
2300 	 symbol is defined locally or was forced to be local because
2301 	 of a version file, we just want to emit a RELATIVE reloc.
2302 	 The entry in the global offset table will already have been
2303 	 initialized in the relocate_section function.  */
2304       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
2305 	{
2306 	  BFD_ASSERT ((h->got.offset & 1) != 0);
2307 	  rel.r_info = ELF32_R_INFO (0, R_CKCORE_RELATIVE);
2308 	  rel.r_addend = (h->root.u.def.value
2309 			  + h->root.u.def.section->output_offset
2310 			  + h->root.u.def.section->output_section->vma);
2311 	}
2312       else
2313 	{
2314 	  BFD_ASSERT ((h->got.offset & 1) == 0);
2315 	  bfd_put_32 (output_bfd, (bfd_vma) 0,
2316 		      htab->elf.sgot->contents + h->got.offset);
2317 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_CKCORE_GLOB_DAT);
2318 	  rel.r_addend = 0;
2319 	}
2320 
2321       loc = htab->elf.srelgot->contents;
2322       loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
2323 
2324       if (loc != NULL)
2325 	bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
2326     }
2327 
2328   if (h->needs_copy)
2329     {
2330       asection *s;
2331       Elf_Internal_Rela rela;
2332       bfd_byte *loc;
2333 
2334       /* This symbol needs a copy reloc.  Set it up.  */
2335       BFD_ASSERT (h->dynindx != -1
2336 		  && (h->root.type == bfd_link_hash_defined
2337 		      || h->root.type == bfd_link_hash_defweak));
2338 
2339       rela.r_offset = (h->root.u.def.value
2340 		       + h->root.u.def.section->output_section->vma
2341 		       + h->root.u.def.section->output_offset);
2342       rela.r_info = ELF32_R_INFO (h->dynindx, R_CKCORE_COPY);
2343       rela.r_addend = 0;
2344       if (h->root.u.def.section == htab->elf.sdynrelro)
2345 	s = htab->elf.sreldynrelro;
2346       else
2347 	s = htab->elf.srelbss;
2348       BFD_ASSERT (s != NULL);
2349       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
2350       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
2351     }
2352 
2353   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
2354   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2355       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2356     sym->st_shndx = SHN_ABS;
2357 
2358   return TRUE;
2359 }
2360 
2361 /* Finish up the dynamic sections.  */
2362 
2363 static bfd_boolean
2364 csky_elf_finish_dynamic_sections (bfd *output_bfd,
2365 				  struct bfd_link_info *info)
2366 {
2367   struct csky_elf_link_hash_table *htab;
2368   bfd *dynobj;
2369   asection *sdyn;
2370   asection *got_sec;
2371 
2372   htab = csky_elf_hash_table (info);
2373   if (htab == NULL)
2374     return FALSE;
2375 
2376   dynobj = htab->elf.dynobj;
2377   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2378 
2379   if (htab->elf.dynamic_sections_created)
2380     {
2381       Elf32_External_Dyn *dyncon, *dynconend;
2382 
2383       BFD_ASSERT (sdyn != NULL && htab->elf.sgot != NULL);
2384 
2385       dyncon = (Elf32_External_Dyn *) sdyn->contents;
2386       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2387       for (; dyncon < dynconend; dyncon++)
2388 	{
2389 	  Elf_Internal_Dyn dyn;
2390 	  bfd_boolean size = FALSE;
2391 	  const char *name = NULL;
2392 
2393 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2394 	  switch (dyn.d_tag)
2395 	    {
2396 	    default:
2397 	      continue;
2398 	    case DT_RELA:
2399 	      name = ".rela.dyn";
2400 	      size = FALSE;
2401 	      break;
2402 	    case DT_RELASZ:
2403 	      name = ".rela.dyn";
2404 	      size = TRUE;
2405 	      break;
2406 	    case DT_PLTRELSZ:
2407 	      name = ".rela.plt";
2408 	      size = TRUE;
2409 	      break;
2410 	    case DT_PLTGOT:
2411 	      dyn.d_un.d_ptr = htab->elf.sgot->output_section->vma;
2412 	      break;
2413 	    case DT_JMPREL:
2414 	      dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma
2415 			       + htab->elf.srelplt->output_offset;
2416 	      break;
2417 	    }
2418 
2419 	  if (name != NULL)
2420 	    {
2421 	      asection *s = bfd_get_section_by_name (output_bfd, name);
2422 
2423 	      if (s == NULL)
2424 		dyn.d_un.d_val = 0;
2425 	      else if (!size)
2426 		dyn.d_un.d_ptr = s->vma;
2427 	      else
2428 		dyn.d_un.d_val = s->size;
2429 	    }
2430 	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2431 	}
2432     }
2433 
2434   /* Fill in the first three entries in the global offset table.  */
2435   if (htab->elf.sgotplt)
2436     got_sec = htab->elf.sgotplt;
2437   else
2438     got_sec = htab->elf.sgot;
2439   if (got_sec != NULL)
2440     {
2441       if (got_sec->size > 0)
2442 	{
2443 	  bfd_put_32 (output_bfd,
2444 		      (sdyn == NULL ? (bfd_vma) 0
2445 		       : sdyn->output_section->vma + sdyn->output_offset),
2446 		      got_sec->contents);
2447 	  bfd_put_32 (output_bfd, (bfd_vma) 0, got_sec->contents + 4);
2448 	  bfd_put_32 (output_bfd, (bfd_vma) 0, got_sec->contents + 8);
2449 	}
2450       elf_section_data (got_sec->output_section)->this_hdr.sh_entsize = 4;
2451     }
2452   return TRUE;
2453 }
2454 
2455 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2456 
2457 static void
2458 csky_elf_copy_indirect_symbol (struct bfd_link_info *info,
2459 			       struct elf_link_hash_entry *dir,
2460 			       struct elf_link_hash_entry *ind)
2461 {
2462   struct csky_elf_link_hash_entry *edir, *eind;
2463 
2464   edir = (struct csky_elf_link_hash_entry *) dir;
2465   eind = (struct csky_elf_link_hash_entry *) ind;
2466 
2467   if (eind->dyn_relocs != NULL)
2468     {
2469       if (edir->dyn_relocs != NULL)
2470 	{
2471 	  struct elf_dyn_relocs **pp;
2472 	  struct elf_dyn_relocs *p;
2473 
2474 	  /* Add reloc counts against the indirect sym to the direct sym
2475 	     list.  Merge any entries against the same section.  */
2476 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2477 	    {
2478 	      struct elf_dyn_relocs *q;
2479 
2480 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
2481 		if (q->sec == p->sec)
2482 		  {
2483 		    q->pc_count += p->pc_count;
2484 		    q->count += p->count;
2485 		    *pp = p->next;
2486 		    break;
2487 		  }
2488 	      if (q == NULL)
2489 		pp = &p->next;
2490 	    }
2491 	  *pp = edir->dyn_relocs;
2492 	}
2493       edir->dyn_relocs = eind->dyn_relocs;
2494       eind->dyn_relocs = NULL;
2495     }
2496   if (ind->root.type == bfd_link_hash_indirect
2497       && dir->got.refcount <= 0)
2498     {
2499       edir->tls_type = eind->tls_type;
2500       eind->tls_type = GOT_UNKNOWN;
2501     }
2502   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2503 }
2504 
2505 /* Used to decide how to sort relocs in an optimal manner for the
2506    dynamic linker, before writing them out.  */
2507 
2508 static enum elf_reloc_type_class
2509 csky_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2510 			   const asection *rel_sec ATTRIBUTE_UNUSED,
2511 			   const Elf_Internal_Rela *rela)
2512 {
2513   switch ((int) ELF32_R_TYPE (rela->r_info))
2514     {
2515     case R_CKCORE_RELATIVE:
2516       return reloc_class_relative;
2517     case R_CKCORE_JUMP_SLOT:
2518       return reloc_class_plt;
2519     case R_CKCORE_COPY:
2520       return reloc_class_copy;
2521     case R_CKCORE_IRELATIVE:
2522       return reloc_class_ifunc;
2523     default:
2524       return reloc_class_normal;
2525     }
2526 }
2527 
2528 /* Return the section that should be marked against GC for a given
2529    relocation.  */
2530 
2531 static asection *
2532 csky_elf_gc_mark_hook (asection *sec,
2533 		       struct bfd_link_info *info,
2534 		       Elf_Internal_Rela *rel,
2535 		       struct elf_link_hash_entry *h,
2536 		       Elf_Internal_Sym *sym)
2537 {
2538   if (h != NULL)
2539     {
2540       switch (ELF32_R_TYPE (rel->r_info))
2541 	{
2542 	case R_CKCORE_GNU_VTINHERIT:
2543 	case R_CKCORE_GNU_VTENTRY:
2544 	  return NULL;
2545 	}
2546     }
2547 
2548   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2549 }
2550 
2551 /* Look through the relocs for a section during the first phase.
2552    Since we don't do .gots or .plts, we just need to consider the
2553    virtual table relocs for gc.  */
2554 
2555 static bfd_boolean
2556 csky_elf_check_relocs (bfd * abfd,
2557 		       struct bfd_link_info * info,
2558 		       asection * sec,
2559 		       const Elf_Internal_Rela * relocs)
2560 {
2561   Elf_Internal_Shdr * symtab_hdr;
2562   struct elf_link_hash_entry ** sym_hashes;
2563   const Elf_Internal_Rela * rel;
2564   const Elf_Internal_Rela * rel_end;
2565   struct csky_elf_link_hash_table *htab;
2566   asection *sreloc;
2567 
2568   /* if output type is relocatable, return.  */
2569   if (bfd_link_relocatable (info))
2570     return TRUE;
2571 
2572   htab = csky_elf_hash_table (info);
2573   if (htab == NULL)
2574     return FALSE;
2575 
2576   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2577   sym_hashes = elf_sym_hashes (abfd);
2578 
2579   rel_end = relocs + sec->reloc_count;
2580   sreloc = NULL;
2581   for (rel = relocs; rel < rel_end; rel++)
2582     {
2583       struct elf_link_hash_entry *h;
2584       unsigned long r_symndx;
2585       Elf_Internal_Sym *isym;
2586       int r_type;
2587 
2588       r_symndx = ELF32_R_SYM (rel->r_info);
2589       r_type = ELF32_R_TYPE (rel->r_info);
2590       if (r_symndx < symtab_hdr->sh_info)
2591 	{
2592 	  /* A local symbol.  */
2593 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2594 					abfd, r_symndx);
2595 	  if (isym == NULL)
2596 	    return FALSE;
2597 	  h = NULL;
2598 	}
2599       else
2600 	{
2601 	  isym = NULL;
2602 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2603 	  while (h->root.type == bfd_link_hash_indirect
2604 		 || h->root.type == bfd_link_hash_warning)
2605 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
2606 	}
2607 
2608       switch (r_type)
2609 	{
2610 	case R_CKCORE_PCREL_IMM26BY2:
2611 	case R_CKCORE_PCREL_IMM11BY2:
2612 	case R_CKCORE_PCREL_JSR_IMM11BY2:
2613 	case R_CKCORE_PCREL_JSR_IMM26BY2:
2614 	  /* If the symbol is '*UND*', means this reloc is used for
2615 	   * callgraph, don't need to leave to shared object. */
2616 	  if (r_symndx == 0)
2617 	    break;
2618 	  /* Else fall through.  */
2619 	case R_CKCORE_ADDR32:
2620 	case R_CKCORE_ADDR_HI16:
2621 	case R_CKCORE_ADDR_LO16:
2622 	  if (h != NULL
2623 	      && bfd_link_executable (info)
2624 	      && r_type == R_CKCORE_ADDR32
2625 	      && h->type == STT_OBJECT
2626 	      && (sec->flags & SEC_ALLOC) != 0
2627 	      && (sec->flags & SEC_READONLY))
2628 	    /* If this reloc is in a read-only section, we might
2629 	       need a copy reloc.  We can't check reliably at this
2630 	       stage whether the section is read-only, as input
2631 	       sections have not yet been mapped to output sections.
2632 	       Tentatively set the flag for now, and correct in
2633 	       adjust_dynamic_symbol.  */
2634 	    h->non_got_ref = 1;
2635 
2636 	  /* If we are creating a shared library or relocatable executable,
2637 	     and this is a reloc against a global symbol, then we need to
2638 	     copy the reloc into the shared library. However, if we are
2639 	     linking with -Bsymbolic, we do not need to copy a reloc
2640 	     against a global symbol which is defined in an object we are
2641 	     including in the link (i.e., DEF_REGULAR is set).  At
2642 	     this point we have not seen all the input files, so it is
2643 	     possible that DEF_REGULAR is not set now but will be set
2644 	     later (it is never cleared). We account for that possibility
2645 	     below by storing information in the relocs_copied field of
2646 	     the hash table entry.  */
2647 	  if ((bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0)
2648 	      || (!bfd_link_pic (info)
2649 		  && (sec->flags & SEC_ALLOC) != 0
2650 		  && h != NULL
2651 		  && (h->root.type == bfd_link_hash_defweak
2652 		      || !h->def_regular)))
2653 	    {
2654 	      struct elf_dyn_relocs *p;
2655 	      struct elf_dyn_relocs **head;
2656 	      /* We must copy these reloc types into the output file.
2657 		 Create a reloc section in dynobj and make room for
2658 		 this reloc.  */
2659 	      if (sreloc == NULL)
2660 		{
2661 		  if (htab->elf.dynobj == NULL)
2662 		    htab->elf.dynobj = abfd;
2663 
2664 		  sreloc = _bfd_elf_make_dynamic_reloc_section
2665 		    (sec, htab->elf.dynobj, 2, abfd, TRUE);
2666 
2667 		  if (sreloc == NULL)
2668 		    return FALSE;
2669 		}
2670 
2671 	      if (h == NULL && !use_branch_stub
2672 		  && ((ELF32_R_TYPE (rel->r_info)
2673 		       == R_CKCORE_PCREL_IMM26BY2)
2674 		      || (ELF32_R_TYPE (rel->r_info)
2675 			  == R_CKCORE_PCREL_IMM11BY2)))
2676 		break;
2677 
2678 	      /* If this is a global symbol, we count the number of
2679 		 relocations we need for this symbol.  */
2680 	      if (h != NULL)
2681 		{
2682 		  struct csky_elf_link_hash_entry *eh;
2683 		  eh = (struct  csky_elf_link_hash_entry *)h;
2684 		  if ((ELF32_R_TYPE (rel->r_info)
2685 		       == R_CKCORE_PCREL_JSR_IMM26BY2)
2686 		      || (ELF32_R_TYPE (rel->r_info)
2687 			  == R_CKCORE_PCREL_JSR_IMM11BY2))
2688 		    eh->jsri2bsr_refcount += 1;
2689 		  head = &eh->dyn_relocs;
2690 		}
2691 	      else
2692 		{
2693 		  /* Track dynamic relocs needed for local syms too.
2694 		     We really need local syms available to do this
2695 		     easily.  Oh well.  */
2696 		  void **vpp;
2697 		  asection *s;
2698 		  Elf_Internal_Sym *loc_isym;
2699 
2700 		  loc_isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2701 						    abfd, r_symndx);
2702 		  if (loc_isym == NULL)
2703 		    return FALSE;
2704 		  s = bfd_section_from_elf_index (abfd, loc_isym->st_shndx);
2705 		  if (s == NULL)
2706 		    s = sec;
2707 		  vpp = &elf_section_data (s)->local_dynrel;
2708 		  head = (struct elf_dyn_relocs **)vpp;
2709 		}
2710 
2711 	      p = *head;
2712 	      if (p == NULL || p->sec != sec)
2713 		{
2714 		  bfd_size_type amt = sizeof *p;
2715 		  p = ((struct elf_dyn_relocs *)
2716 		       bfd_alloc (htab->elf.dynobj, amt));
2717 		  if (p == NULL)
2718 		    return FALSE;
2719 		  p->next = *head;
2720 		  *head = p;
2721 		  p->sec = sec;
2722 		  p->count = 0;
2723 		  p->pc_count = 0;
2724 		}
2725 
2726 	      if (ELF32_R_TYPE (rel->r_info) == R_CKCORE_PCREL_IMM26BY2
2727 		  || ELF32_R_TYPE (rel->r_info) == R_CKCORE_PCREL_IMM11BY2)
2728 		p->pc_count += 1;
2729 	      p->count += 1;
2730 	    }
2731 	  break;
2732 
2733 	case R_CKCORE_PLT_IMM18BY4:
2734 	case R_CKCORE_PLT32:
2735 	  /* This symbol requires a procedure linkage table entry.  We
2736 	     actually build the entry in adjust_dynamic_symbol,
2737 	     because this might be a case of linking PIC code which is
2738 	     never referenced by a dynamic object, in which case we
2739 	     don't need to generate a procedure linkage table entry
2740 	     after all.  */
2741 
2742 	  /* If this is a local symbol, we resolve it directly without
2743 	     creating a procedure linkage table entry.  */
2744 	  if (h == NULL)
2745 	    continue;
2746 	  if (ELF32_R_TYPE (rel->r_info) == R_CKCORE_PLT_IMM18BY4)
2747 	    check_got_overflow = 1;
2748 
2749 	  h->needs_plt = 1;
2750 	  h->plt.refcount += 1;
2751 	  h->got.refcount += 1;
2752 	  ((struct  csky_elf_link_hash_entry *)h)->plt_refcount += 1;
2753 	  break;
2754 
2755 	case R_CKCORE_GOT12:
2756 	case R_CKCORE_PLT12:
2757 	case R_CKCORE_GOT32:
2758 	case R_CKCORE_GOT_HI16:
2759 	case R_CKCORE_GOT_LO16:
2760 	case R_CKCORE_PLT_HI16:
2761 	case R_CKCORE_PLT_LO16:
2762 	case R_CKCORE_GOT_IMM18BY4:
2763 	case R_CKCORE_TLS_IE32:
2764 	case R_CKCORE_TLS_GD32:
2765 	  {
2766 	    int tls_type, old_tls_type;
2767 
2768 	    if (h != NULL
2769 		&& bfd_link_executable (info)
2770 		&& r_type == R_CKCORE_GOT_IMM18BY4
2771 		&& (sec->flags & SEC_ALLOC) != 0
2772 		&& (sec->flags & SEC_READONLY))
2773 	      /* If this reloc is in a read-only section, we might
2774 		 need a copy reloc.  We can't check reliably at this
2775 		 stage whether the section is read-only, as input
2776 		 sections have not yet been mapped to output sections.
2777 		 Tentatively set the flag for now, and correct in
2778 		 adjust_dynamic_symbol.  */
2779 	      h->non_got_ref = 1;
2780 
2781 	    switch (ELF32_R_TYPE (rel->r_info))
2782 	      {
2783 	      case R_CKCORE_TLS_IE32:
2784 		tls_type = GOT_TLS_IE;
2785 		break;
2786 	      case R_CKCORE_TLS_GD32:
2787 		tls_type = GOT_TLS_GD;
2788 		break;
2789 	      default:
2790 		tls_type = GOT_NORMAL;
2791 		break;
2792 	      }
2793 	    if (h != NULL)
2794 	      {
2795 		if (ELF32_R_TYPE (rel->r_info) == R_CKCORE_GOT_IMM18BY4)
2796 		  check_got_overflow = 1;
2797 		h->got.refcount += 1;
2798 		old_tls_type = csky_elf_hash_entry (h)->tls_type;
2799 	      }
2800 	    else
2801 	      {
2802 		bfd_signed_vma *local_got_refcounts;
2803 
2804 		/* This is a global offset table entry for a local symbol.  */
2805 		/* we can write a new function named
2806 		   elf32_csky_allocate_local_sym_info() to replace
2807 		   following code.  */
2808 		local_got_refcounts = elf_local_got_refcounts (abfd);
2809 		if (local_got_refcounts == NULL)
2810 		  {
2811 		    bfd_size_type size;
2812 
2813 		    size = symtab_hdr->sh_info;
2814 		    size *= (sizeof (bfd_signed_vma) + sizeof (char));
2815 		    local_got_refcounts = ((bfd_signed_vma *)
2816 					   bfd_zalloc (abfd, size));
2817 		    if (local_got_refcounts == NULL)
2818 		      return FALSE;
2819 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
2820 		    csky_elf_local_got_tls_type (abfd)
2821 		      = (char *) (local_got_refcounts + symtab_hdr->sh_info);
2822 		  }
2823 		local_got_refcounts[r_symndx] += 1;
2824 		old_tls_type = csky_elf_local_got_tls_type (abfd)[r_symndx];
2825 	      }
2826 
2827 	    /* We will already have issued an error message if there is a
2828 	       TLS / non-TLS mismatch, based on the symbol type.  We don't
2829 	       support any linker relaxations.  So just combine any TLS
2830 	       types needed.  */
2831 	    if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
2832 		&& tls_type != GOT_NORMAL)
2833 	      tls_type |= old_tls_type;
2834 
2835 	    if (old_tls_type != tls_type)
2836 	      {
2837 		if (h != NULL)
2838 		  csky_elf_hash_entry (h)->tls_type = tls_type;
2839 		else
2840 		  csky_elf_local_got_tls_type (abfd)[r_symndx] = tls_type;
2841 	      }
2842 	  }
2843 	  /* Fall through.  */
2844 
2845 	case R_CKCORE_TLS_LDM32:
2846 	  if (ELF32_R_TYPE (rel->r_info) == R_CKCORE_TLS_LDM32)
2847 	    htab->tls_ldm_got.refcount++;
2848 	  /* Fall through.  */
2849 
2850 	case R_CKCORE_GOTOFF:
2851 	case R_CKCORE_GOTPC:
2852 	case R_CKCORE_GOTOFF_HI16:
2853 	case R_CKCORE_GOTOFF_LO16:
2854 	case R_CKCORE_GOTPC_HI16:
2855 	case R_CKCORE_GOTPC_LO16:
2856 	case R_CKCORE_GOTOFF_IMM18:
2857 	  if (htab->elf.sgot == NULL)
2858 	    {
2859 	      if (htab->elf.dynobj == NULL)
2860 		htab->elf.dynobj = abfd;
2861 	      if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
2862 		return FALSE;
2863 	    }
2864 	  break;
2865 
2866 	  /* This relocation describes the C++ object vtable hierarchy.
2867 	     Reconstruct it for later use during GC.  */
2868 	case R_CKCORE_GNU_VTINHERIT:
2869 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2870 	    return FALSE;
2871 	  break;
2872 
2873 	  /* This relocation describes which C++ vtable entries are actually
2874 	     used.  Record for later use during GC.  */
2875 	case R_CKCORE_GNU_VTENTRY:
2876 	  BFD_ASSERT (h != NULL);
2877 	  if (h != NULL
2878 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2879 	    return FALSE;
2880 	  break;
2881 	}
2882     }
2883 
2884   return TRUE;
2885 }
2886 
2887 static const struct bfd_elf_special_section csky_elf_special_sections[]=
2888 {
2889   { STRING_COMMA_LEN (".ctors"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2890   { STRING_COMMA_LEN (".dtors"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2891   { NULL,                     0,  0, 0,            0 }
2892 };
2893 
2894 /* Function to keep CSKY specific flags in the ELF header.  */
2895 
2896 static bfd_boolean
2897 csky_elf_set_private_flags (bfd * abfd, flagword flags)
2898 {
2899   BFD_ASSERT (! elf_flags_init (abfd)
2900 	      || elf_elfheader (abfd)->e_flags == flags);
2901 
2902   elf_elfheader (abfd)->e_flags = flags;
2903   elf_flags_init (abfd) = TRUE;
2904   return TRUE;
2905 }
2906 
2907 static csky_arch_for_merge *
2908 csky_find_arch_with_eflag (const unsigned long arch_eflag)
2909 {
2910   csky_arch_for_merge *csky_arch = NULL;
2911 
2912   for (csky_arch = csky_archs; csky_arch->name != NULL; csky_arch++)
2913     if (csky_arch->arch_eflag == arch_eflag)
2914       break;
2915   if (csky_arch == NULL)
2916     {
2917       _bfd_error_handler (_("warning: unrecognized arch eflag '%#lx'"),
2918 			   arch_eflag);
2919       bfd_set_error (bfd_error_wrong_format);
2920     }
2921   return csky_arch;
2922 }
2923 
2924 /* Merge backend specific data from an object file to the output
2925    object file when linking.  */
2926 
2927 static bfd_boolean
2928 csky_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2929 {
2930   bfd *obfd = info->output_bfd;
2931   flagword old_flags;
2932   flagword new_flags;
2933   csky_arch_for_merge *old_arch = NULL;
2934   csky_arch_for_merge *new_arch = NULL;
2935 
2936   /* Check if we have the same endianness.  */
2937   if (! _bfd_generic_verify_endian_match (ibfd, info))
2938     return FALSE;
2939 
2940   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2941       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2942     return TRUE;
2943 
2944   new_flags = elf_elfheader (ibfd)->e_flags;
2945   old_flags = elf_elfheader (obfd)->e_flags;
2946 
2947   if (! elf_flags_init (obfd))
2948     {
2949       /* First call, no flags set.  */
2950       elf_flags_init (obfd) = TRUE;
2951       elf_elfheader (obfd)->e_flags = new_flags;
2952     }
2953   else if (new_flags == old_flags)
2954     /* Do nothing.  */
2955     ;
2956   else if (new_flags == 0 || old_flags == 0)
2957     /* When one flag is 0, assign the other one's flag.  */
2958       elf_elfheader (obfd)->e_flags = new_flags | old_flags;
2959   else
2960     {
2961       flagword newest_flag = 0;
2962 
2963       if ((new_flags & CSKY_ARCH_MASK) != 0
2964 	  && (old_flags & CSKY_ARCH_MASK) != 0)
2965 	{
2966 	  new_arch = csky_find_arch_with_eflag (new_flags & CSKY_ARCH_MASK);
2967 	  old_arch = csky_find_arch_with_eflag (old_flags & CSKY_ARCH_MASK);
2968 	  /* Collect flags like e, f, g.  */
2969 	  newest_flag = (old_flags & (~CSKY_ARCH_MASK))
2970 			 | (new_flags & (~CSKY_ARCH_MASK));
2971 	  if (new_arch != NULL && old_arch != NULL)
2972 	    {
2973 	      if (new_arch->class != old_arch->class)
2974 		{
2975 		  _bfd_error_handler
2976 		    /* xgettext:c-format */
2977 		    (_("%pB: machine flag conflict with target"), ibfd);
2978 		  bfd_set_error (bfd_error_wrong_format);
2979 		  return FALSE;
2980 		}
2981 	      else if (new_arch->class_level != old_arch->class_level)
2982 		{
2983 		  csky_arch_for_merge *newest_arch
2984 		    = (new_arch->class_level > old_arch->class_level
2985 		       ? new_arch : old_arch);
2986 		  if (new_arch->do_warning || old_arch->do_warning)
2987 		    {
2988 		      _bfd_error_handler
2989 			/* xgettext:c-format */
2990 			(_("warning: file %pB's arch flag ck%s conflicts with "
2991 			   "target ck%s, using ck%s"),
2992 			 ibfd, new_arch->name, old_arch->name,
2993 			 newest_arch->name);
2994 		       bfd_set_error (bfd_error_wrong_format);
2995 		    }
2996 
2997 		  newest_flag |= newest_arch->arch_eflag;
2998 		}
2999 	      else
3000 		newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
3001 				| (old_flags
3002 				   & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
3003 	    }
3004 	  else
3005 	    newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
3006 			    | (old_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
3007 	}
3008       else
3009 	newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
3010 			| (old_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
3011 
3012       elf_elfheader (obfd)->e_flags = newest_flag;
3013     }
3014   return TRUE;
3015 }
3016 
3017 /* Ignore the discarded relocs in special sections in link time.  */
3018 
3019 static bfd_boolean
3020 csky_elf_ignore_discarded_relocs (asection *sec)
3021 {
3022   if (strcmp (sec->name, ".csky_stack_size") == 0)
3023     return TRUE;
3024   return FALSE;
3025 }
3026 
3027 /* .csky_stack_size are not referenced directly.  This pass marks all of
3028    them as required.  */
3029 
3030 static bfd_boolean
3031 elf32_csky_gc_mark_extra_sections (struct bfd_link_info *info,
3032 				   elf_gc_mark_hook_fn gc_mark_hook ATTRIBUTE_UNUSED)
3033 {
3034   bfd *sub;
3035 
3036   _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
3037 
3038   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3039     {
3040       asection *o;
3041 
3042       for (o = sub->sections; o != NULL; o = o->next)
3043 	if (strcmp (o->name, ".csky_stack_size") == 0)
3044 	  o->gc_mark = 1;
3045     }
3046 
3047   return TRUE;
3048 }
3049 
3050 /* The linker repeatedly calls this function for each input section,
3051    in the order that input sections are linked into output sections.
3052    Build lists of input sections to determine groupings between which
3053    we may insert linker stubs.  */
3054 
3055 void
3056 elf32_csky_next_input_section (struct bfd_link_info *info,
3057 			       asection *isec)
3058 {
3059   struct csky_elf_link_hash_table *htab = csky_elf_hash_table (info);
3060   if (htab == NULL)
3061     return;
3062   if (isec->output_section->index <= htab->top_index)
3063     {
3064       asection **list = htab->input_list + isec->output_section->index;
3065 
3066       if (*list != bfd_abs_section_ptr)
3067 	{
3068 	  /* Steal the link_sec pointer for our list.  */
3069 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3070 	  /* This happens to make the list in reverse order,
3071 	     which we reverse later in group_sections.  */
3072 	  PREV_SEC (isec) = *list;
3073 	  *list = isec;
3074 	}
3075     }
3076 }
3077 
3078 /* See whether we can group stub sections together.  Grouping stub
3079    sections may result in fewer stubs.  More importantly, we need to
3080    put all .init* and .fini* stubs at the end of the .init or
3081    .fini output sections respectively, because glibc splits the
3082    _init and _fini functions into multiple parts.  Putting a stub in
3083    the middle of a function is not a good idea.  */
3084 
3085 static void
3086 group_sections (struct csky_elf_link_hash_table *htab,
3087 		bfd_size_type stub_group_size,
3088 		bfd_boolean stubs_always_after_branch)
3089 {
3090   asection **list = htab->input_list;
3091 
3092   do
3093     {
3094       asection *tail = *list;
3095       asection *head;
3096 
3097       if (tail == bfd_abs_section_ptr)
3098 	continue;
3099 
3100       /* Reverse the list: we must avoid placing stubs at the
3101          beginning of the section because the beginning of the text
3102          section may be required for an interrupt vector in bare metal
3103          code.  */
3104 #define NEXT_SEC PREV_SEC
3105       head = NULL;
3106       while (tail != NULL)
3107 	{
3108 	  /* Pop from tail.  */
3109 	  asection *item = tail;
3110 	  tail = PREV_SEC (item);
3111 
3112 	  /* Push on head.  */
3113 	  NEXT_SEC (item) = head;
3114 	  head = item;
3115 	}
3116 
3117       while (head != NULL)
3118 	{
3119 	  asection *curr;
3120 	  asection *next;
3121 	  bfd_vma stub_group_start = head->output_offset;
3122 	  bfd_vma end_of_next;
3123 
3124 	  curr = head;
3125 	  while (NEXT_SEC (curr) != NULL)
3126 	    {
3127 	      next = NEXT_SEC (curr);
3128 	      end_of_next = next->output_offset + next->size;
3129 	      if (end_of_next - stub_group_start >= stub_group_size)
3130 		/* End of NEXT is too far from start, so stop.  */
3131 		break;
3132 	      curr = next;
3133 	    }
3134 
3135 	  /* OK, the size from the start to the start of CURR is less
3136 	   * than stub_group_size and thus can be handled by one stub
3137 	   * section.  (Or the head section is itself larger than
3138 	   * stub_group_size, in which case we may be toast.)
3139 	   * We should really be keeping track of the total size of
3140 	   * stubs added here, as stubs contribute to the final output
3141 	   * section size.  */
3142 	  do
3143 	    {
3144 	      next = NEXT_SEC (head);
3145 	      /* Set up this stub group.  */
3146 	      htab->stub_group[head->id].link_sec = curr;
3147 	    }
3148 	  while (head != curr && (head = next) != NULL);
3149 
3150 	  /* But wait, there's more!  Input sections up to stub_group_size
3151 	   * bytes after the stub section can be handled by it too.  */
3152 	  if (!stubs_always_after_branch)
3153 	    {
3154 	      stub_group_start = curr->output_offset + curr->size;
3155 
3156 	      while (next != NULL)
3157 		{
3158 		  end_of_next = next->output_offset + next->size;
3159 		  if (end_of_next - stub_group_start >= stub_group_size)
3160 		    /* End of NEXT is too far from stubs, so stop.  */
3161 		    break;
3162 		  /* Add NEXT to the stub group.  */
3163 		  head = next;
3164 		  next = NEXT_SEC (head);
3165 		  htab->stub_group[head->id].link_sec = curr;
3166 		}
3167 	    }
3168 	  head = next;
3169 	}
3170     }
3171   while (list++ != htab->input_list + htab->top_index);
3172 
3173   free (htab->input_list);
3174 #undef PREV_SEC
3175 #undef NEXT_SEC
3176 }
3177 
3178 /* If the symbol referenced by bsr is defined in shared object file,
3179    or it is a weak symbol and we aim to create shared object file,
3180    we must create a stub for this bsr.  */
3181 
3182 static bfd_boolean
3183 sym_must_create_stub (struct elf_link_hash_entry *h,
3184 		      struct bfd_link_info *info)
3185 {
3186   if (h != NULL
3187       && ((h->def_dynamic && !h->def_regular)
3188 	  || (bfd_link_pic (info) && h->root.type == bfd_link_hash_defweak)))
3189     return TRUE;
3190   else
3191     return FALSE;
3192 }
3193 
3194 /* Calculate the template, template size and instruction size for a stub.
3195    Return value is the instruction size.  */
3196 
3197 static unsigned int
3198 find_stub_size_and_template (enum elf32_csky_stub_type stub_type,
3199 			     const insn_sequence **stub_template,
3200 			     int *stub_template_size)
3201 {
3202   const insn_sequence *template_sequence = NULL;
3203   int template_size = 0;
3204   int i;
3205   unsigned int size;
3206 
3207   template_sequence = stub_definitions[stub_type].template_sequence;
3208   template_size = stub_definitions[stub_type].template_size;
3209 
3210   size = 0;
3211   for (i = 0; i < template_size; i++)
3212     {
3213       switch (template_sequence[i].type)
3214       {
3215       case INSN16:
3216 	size += 2;
3217 	break;
3218 
3219       case INSN32:
3220       case DATA_TYPE:
3221 	size += 4;
3222 	break;
3223 
3224       default:
3225 	BFD_FAIL ();
3226 	return FALSE;
3227       }
3228     }
3229 
3230   if (stub_template)
3231     *stub_template = template_sequence;
3232   if (stub_template_size)
3233     *stub_template_size = template_size;
3234 
3235   return size;
3236 }
3237 
3238 /* As above, but don't actually build the stub.  Just bump offset so
3239    we know stub section sizes.  */
3240 
3241 static bfd_boolean
3242 csky_size_one_stub (struct bfd_hash_entry *gen_entry,
3243 		    void * in_arg ATTRIBUTE_UNUSED)
3244 {
3245   struct elf32_csky_stub_hash_entry *stub_entry;
3246   const insn_sequence *template_sequence = NULL;
3247   int template_size = 0;
3248   int size = 0;
3249 
3250   /* Massage our args to the form they really have.  */
3251   stub_entry = (struct elf32_csky_stub_hash_entry *) gen_entry;
3252 
3253   BFD_ASSERT (stub_entry->stub_type > csky_stub_none
3254 	      && stub_entry->stub_type < ARRAY_SIZE (stub_definitions));
3255   size = find_stub_size_and_template (stub_entry->stub_type,
3256 				      &template_sequence, &template_size);
3257   stub_entry->stub_size = size;
3258   stub_entry->stub_template = template_sequence;
3259   stub_entry->stub_template_size = template_size;
3260 
3261   size = (size + 7) & ~7;
3262   stub_entry->stub_sec->size += size;
3263   return TRUE;
3264 }
3265 
3266 /* Add a new stub entry to the stub hash.  Not all fields of the new
3267    stub entry are initialised.  */
3268 
3269 static struct elf32_csky_stub_hash_entry *
3270 elf32_csky_add_stub (const char *stub_name,
3271 		     asection *section,
3272 		     struct csky_elf_link_hash_table *htab)
3273 {
3274   asection *link_sec;
3275   asection *stub_sec;
3276   struct elf32_csky_stub_hash_entry *stub_entry;
3277 
3278   stub_sec = elf32_csky_create_or_find_stub_sec (&link_sec, section, htab);
3279   if (stub_sec == NULL)
3280     return NULL;
3281 
3282   /* Enter this entry into the linker stub hash table.  */
3283   stub_entry = csky_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3284 				      TRUE, FALSE);
3285   if (stub_entry == NULL)
3286     {
3287       _bfd_error_handler (_("%pB: cannot create stub entry %s"),
3288 			  section->owner, stub_name);
3289       return NULL;
3290     }
3291 
3292   stub_entry->stub_sec = stub_sec;
3293   stub_entry->stub_offset = 0;
3294   stub_entry->id_sec = link_sec;
3295 
3296   return stub_entry;
3297 }
3298 
3299 /* Determine and set the size of the stub section for a final link.
3300    The basic idea here is to examine all the relocations looking for
3301    PC-relative calls to a target that is unreachable with a "bsr"
3302    instruction.  */
3303 
3304 bfd_boolean
3305 elf32_csky_size_stubs (bfd *output_bfd,
3306 		       bfd *stub_bfd,
3307 		       struct bfd_link_info *info,
3308 		       bfd_signed_vma group_size,
3309 		       asection *(*add_stub_section) (const char*, asection*),
3310 		       void (*layout_sections_again) (void))
3311 {
3312   bfd_size_type stub_group_size;
3313   bfd_boolean stubs_always_after_branch;
3314   struct csky_elf_link_hash_table *htab = csky_elf_hash_table (info);
3315 
3316   if (htab == NULL)
3317     return FALSE;
3318 
3319   /* Propagate mach to stub bfd, because it may not have been
3320      finalized when we created stub_bfd.  */
3321   bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
3322 		     bfd_get_mach (output_bfd));
3323 
3324   /* Stash our params away.  */
3325   htab->stub_bfd = stub_bfd;
3326   htab->add_stub_section = add_stub_section;
3327   htab->layout_sections_again = layout_sections_again;
3328   stubs_always_after_branch = group_size < 0;
3329 
3330   if (group_size < 0)
3331     stub_group_size = -group_size;
3332   else
3333     stub_group_size = group_size;
3334 
3335   if (stub_group_size == 1)
3336     /* The 'bsr' range in abiv2 is +-64MB has to be used as the
3337        default maximum size.
3338        This value is 128K less than that, which allows for 131072
3339        byte stubs. If we exceed that, then we will fail to link.
3340        The user will have to relink with an explicit group size
3341        option.  */
3342     stub_group_size = 66977792;
3343 
3344   group_sections (htab, stub_group_size, stubs_always_after_branch);
3345 
3346   while (1)
3347     {
3348       bfd *input_bfd;
3349       unsigned int bfd_indx;
3350       asection *stub_sec;
3351       bfd_boolean stub_changed = FALSE;
3352 
3353       for (input_bfd = info->input_bfds, bfd_indx = 0;
3354 	   input_bfd != NULL;
3355 	   input_bfd = input_bfd->link.next, bfd_indx++)
3356 	{
3357 	  Elf_Internal_Shdr *symtab_hdr;
3358 	  asection *section;
3359 	  Elf_Internal_Sym *local_syms = NULL;
3360 
3361 	  /* We'll need the symbol table in a second.  */
3362 	  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3363 	  if (symtab_hdr->sh_info == 0)
3364 	    continue;
3365 
3366 	  /* Walk over each section attached to the input bfd.  */
3367 	  for (section = input_bfd->sections;
3368 	       section != NULL;
3369 	       section = section->next)
3370 	    {
3371 	      Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
3372 
3373 	      /* If there aren't any relocs, then there's nothing more
3374 	       * to do.  */
3375 	      if ((section->flags & SEC_RELOC) == 0
3376 		  || section->reloc_count == 0
3377 		  || (section->flags & SEC_CODE) == 0)
3378 		continue;
3379 
3380 	      /* If this section is a link-once section that will be
3381 		 discarded, then don't create any stubs.  */
3382 	      if (section->output_section == NULL
3383 		  || section->output_section->owner != output_bfd)
3384 		continue;
3385 
3386 	      /* Get the relocs.  */
3387 	      internal_relocs = _bfd_elf_link_read_relocs (input_bfd,
3388 							   section,
3389 							   NULL, NULL,
3390 							   info->keep_memory);
3391 
3392 	      if (internal_relocs == NULL)
3393 		goto error_ret_free_local;
3394 
3395 	      /* Now examine each relocation.  */
3396 	      irela = internal_relocs;
3397 	      irelaend = irela + section->reloc_count;
3398 	      for (; irela < irelaend; irela++)
3399 		{
3400 		  unsigned int r_type, r_indx;
3401 		  enum elf32_csky_stub_type stub_type;
3402 		  struct elf32_csky_stub_hash_entry *stub_entry;
3403 		  asection *sym_sec;
3404 		  bfd_vma sym_value;
3405 		  bfd_vma destination;
3406 		  struct csky_elf_link_hash_entry *hash;
3407 		  const char *sym_name;
3408 		  char *stub_name;
3409 		  const asection *id_sec;
3410 		  unsigned char st_type;
3411 
3412 		  r_type = ELF32_R_TYPE (irela->r_info);
3413 		  r_indx = ELF32_R_SYM (irela->r_info);
3414 		  if (r_type >= (unsigned int) R_CKCORE_MAX)
3415 		    {
3416 		      bfd_set_error (bfd_error_bad_value);
3417 error_ret_free_internal:
3418 		      if (elf_section_data (section)->relocs == NULL)
3419 			free (internal_relocs);
3420 		      goto error_ret_free_local;
3421 		    }
3422 
3423 		  /* Only look for stubs on branch instructions.  */
3424 		  if (r_type != (unsigned int) R_CKCORE_PCREL_IMM26BY2)
3425 		    continue;
3426 		  /* Now determine the call target, its name, value,
3427 		     section.  */
3428 		  sym_sec = NULL;
3429 		  sym_value = 0;
3430 		  destination = 0;
3431 		  hash = NULL;
3432 		  sym_name = NULL;
3433 		  if (r_indx < symtab_hdr->sh_info)
3434 		    {
3435 		      /* It's a local symbol.  */
3436 		      Elf_Internal_Sym *sym;
3437 		      Elf_Internal_Shdr *hdr;
3438 		      if (local_syms == NULL)
3439 			local_syms =
3440 			  (Elf_Internal_Sym *) symtab_hdr->contents;
3441 		      if (local_syms == NULL)
3442 			{
3443 			  local_syms =
3444 			    bfd_elf_get_elf_syms (input_bfd,
3445 						  symtab_hdr,
3446 						  symtab_hdr->sh_info,
3447 						  0, NULL, NULL, NULL);
3448 			  if (local_syms == NULL)
3449 			    goto error_ret_free_internal;
3450 			}
3451 		      sym = local_syms + r_indx;
3452 		      hdr = elf_elfsections (input_bfd)[sym->st_shndx];
3453 		      sym_sec = hdr->bfd_section;
3454 		      if (!sym_sec)
3455 			/* This is an undefined symbol.  It can never
3456 			   be resolved.  */
3457 			continue;
3458 		      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
3459 			sym_value = sym->st_value;
3460 		      destination = (sym_value + irela->r_addend
3461 				     + sym_sec->output_offset
3462 				     + sym_sec->output_section->vma);
3463 		      st_type = ELF_ST_TYPE (sym->st_info);
3464 		      sym_name =
3465 			bfd_elf_string_from_elf_section (input_bfd,
3466 							 symtab_hdr->sh_link,
3467 							 sym->st_name);
3468 		    }
3469 		  else
3470 		    {
3471 		      /* It's an external symbol.  */
3472 		      int e_indx;
3473 		      e_indx = r_indx - symtab_hdr->sh_info;
3474 		      hash = ((struct csky_elf_link_hash_entry *)
3475 			      elf_sym_hashes (input_bfd)[e_indx]);
3476 
3477 		      while (hash->elf.root.type == bfd_link_hash_indirect
3478 			     || hash->elf.root.type == bfd_link_hash_warning)
3479 			hash = ((struct csky_elf_link_hash_entry *)
3480 				hash->elf.root.u.i.link);
3481 		      if (hash->elf.root.type == bfd_link_hash_defined
3482 			  || hash->elf.root.type == bfd_link_hash_defweak)
3483 			{
3484 			  sym_sec = hash->elf.root.u.def.section;
3485 			  sym_value = hash->elf.root.u.def.value;
3486 
3487 			  struct csky_elf_link_hash_table *globals =
3488 			    csky_elf_hash_table (info);
3489 			  /* FIXME For a destination in a shared library.  */
3490 			  if (globals->elf.splt != NULL && hash != NULL
3491 			      && hash->elf.plt.offset != (bfd_vma) -1)
3492 			    continue;
3493 			  else if (sym_sec->output_section != NULL)
3494 			    destination = (sym_value + irela->r_addend
3495 					   + sym_sec->output_offset
3496 					   + sym_sec->output_section->vma);
3497 			}
3498 		      else if (hash->elf.root.type == bfd_link_hash_undefined
3499 			       || (hash->elf.root.type
3500 				   == bfd_link_hash_undefweak))
3501 			/* FIXME For a destination in a shared library.  */
3502 			continue;
3503 		      else
3504 			{
3505 			  bfd_set_error (bfd_error_bad_value);
3506 			  goto error_ret_free_internal;
3507 			}
3508 		      st_type = ELF_ST_TYPE (hash->elf.type);
3509 		      sym_name = hash->elf.root.root.string;
3510 		    }
3511 		  do
3512 		    {
3513 		      /* Determine what (if any) linker stub is needed.  */
3514 		      stub_type = csky_type_of_stub (info, section, irela,
3515 						     st_type, hash,
3516 						     destination, sym_sec,
3517 						     input_bfd, sym_name);
3518 		      if (stub_type == csky_stub_none)
3519 			break;
3520 
3521 		      /* Support for grouping stub sections.  */
3522 		      id_sec = htab->stub_group[section->id].link_sec;
3523 
3524 		      /* Get the name of this stub.  */
3525 		      stub_name = elf32_csky_stub_name (id_sec, sym_sec, hash,
3526 							irela);
3527 		      if (!stub_name)
3528 			goto error_ret_free_internal;
3529 		      /* We've either created a stub for this reloc already,
3530 			 or we are about to.  */
3531 		      stub_entry
3532 			= csky_stub_hash_lookup	(&htab->stub_hash_table,
3533 						 stub_name,
3534 						 FALSE, FALSE);
3535 		      if (stub_entry != NULL)
3536 			{
3537 			  /* The proper stub has already been created.  */
3538 			  free (stub_name);
3539 			  stub_entry->target_value = sym_value;
3540 			  break;
3541 			}
3542 		      stub_entry = elf32_csky_add_stub (stub_name, section,
3543 							htab);
3544 		      if (stub_entry == NULL)
3545 			{
3546 			  free (stub_name);
3547 			  goto error_ret_free_internal;
3548 			}
3549 		      stub_entry->target_value = sym_value;
3550 		      stub_entry->target_section = sym_sec;
3551 		      stub_entry->stub_type = stub_type;
3552 		      stub_entry->h = hash;
3553 		      stub_entry->st_type = st_type;
3554 
3555 		      if (sym_name == NULL)
3556 			sym_name = "unnamed";
3557 		      stub_entry->output_name =
3558 			bfd_alloc (htab->stub_bfd,
3559 				   (sizeof (STUB_ENTRY_NAME)
3560 				    + strlen (sym_name)));
3561 		      if (stub_entry->output_name == NULL)
3562 			{
3563 			  free (stub_name);
3564 			  goto error_ret_free_internal;
3565 			}
3566 		      sprintf (stub_entry->output_name, STUB_ENTRY_NAME,
3567 			       sym_name);
3568 		      stub_changed = TRUE;
3569 		    }
3570 		  while (0);
3571 		}
3572 	      /* We're done with the internal relocs, free them.  */
3573 	      if (elf_section_data (section)->relocs == NULL)
3574 		free (internal_relocs);
3575 	    }
3576 	}
3577       if (!stub_changed)
3578 	break;
3579       /* OK, we've added some stubs.  Find out the new size of the
3580 	 stub sections.  */
3581       for (stub_sec = htab->stub_bfd->sections;
3582 	   stub_sec != NULL;
3583 	   stub_sec = stub_sec->next)
3584 	{
3585 	  /* Ignore non-stub sections.  */
3586 	  if (!strstr (stub_sec->name, STUB_SUFFIX))
3587 	    continue;
3588 	  stub_sec->size = 0;
3589 	}
3590       bfd_hash_traverse (&htab->stub_hash_table, csky_size_one_stub, htab);
3591       /* Ask the linker to do its stuff.  */
3592       (*htab->layout_sections_again) ();
3593     }
3594 
3595   return TRUE;
3596 error_ret_free_local:
3597   return FALSE;
3598 }
3599 
3600 static bfd_boolean
3601 csky_build_one_stub (struct bfd_hash_entry *gen_entry,
3602 		     void * in_arg)
3603 {
3604 #define MAXRELOCS 2
3605   struct elf32_csky_stub_hash_entry *stub_entry;
3606   struct bfd_link_info *info;
3607   asection *stub_sec;
3608   bfd *stub_bfd;
3609   bfd_byte *loc;
3610   bfd_vma sym_value;
3611   int template_size;
3612   int size;
3613   const insn_sequence *template_sequence;
3614   int i;
3615   struct csky_elf_link_hash_table * globals;
3616   int stub_reloc_idx[MAXRELOCS] = {-1, -1};
3617   int stub_reloc_offset[MAXRELOCS] = {0, 0};
3618   int nrelocs = 0;
3619   struct elf_link_hash_entry *h = NULL;
3620 
3621   /* Massage our args to the form they really have.  */
3622   stub_entry = (struct elf32_csky_stub_hash_entry *)gen_entry;
3623   info = (struct bfd_link_info *) in_arg;
3624 
3625   globals = csky_elf_hash_table (info);
3626   if (globals == NULL)
3627     return FALSE;
3628   stub_sec = stub_entry->stub_sec;
3629 
3630   /* Make a note of the offset within the stubs for this entry.  */
3631   stub_entry->stub_offset = stub_sec->size;
3632   loc = stub_sec->contents + stub_entry->stub_offset;
3633 
3634   stub_bfd = stub_sec->owner;
3635 
3636   /* This is the address of the stub destination.  */
3637   h = &stub_entry->h->elf;
3638   if (sym_must_create_stub (h, info)
3639       && !(bfd_link_pic (info)
3640 	   && h->root.type == bfd_link_hash_defweak
3641 	   && h->def_regular
3642 	   && !h->def_dynamic))
3643     sym_value = 0;
3644   else
3645     sym_value = (stub_entry->target_value
3646 		 + stub_entry->target_section->output_offset
3647 		 + stub_entry->target_section->output_section->vma);
3648 
3649   template_sequence = stub_entry->stub_template;
3650   template_size = stub_entry->stub_template_size;
3651 
3652   size = 0;
3653   for (i = 0; i < template_size; i++)
3654     switch (template_sequence[i].type)
3655       {
3656       case INSN16:
3657 	bfd_put_16 (stub_bfd, (bfd_vma) template_sequence[i].data,
3658 		    loc + size);
3659 	size += 2;
3660 	break;
3661       case INSN32:
3662 	csky_put_insn_32 (stub_bfd, (bfd_vma) template_sequence[i].data,
3663 			  loc + size);
3664 	size += 4;
3665 	break;
3666       case DATA_TYPE:
3667 	bfd_put_32 (stub_bfd, (bfd_vma) template_sequence[i].data,
3668 		    loc + size);
3669 	stub_reloc_idx[nrelocs] = i;
3670 	stub_reloc_offset[nrelocs++] = size;
3671 	size += 4;
3672 	break;
3673       default:
3674 	BFD_FAIL ();
3675 	return FALSE;
3676       }
3677   stub_sec->size += size;
3678 
3679   /* Stub size has already been computed in csky_size_one_stub. Check
3680      consistency.  */
3681   BFD_ASSERT (size == stub_entry->stub_size);
3682 
3683   /* Assume there is at least one and at most MAXRELOCS entries to relocate
3684      in each stub.  */
3685   BFD_ASSERT (nrelocs != 0 && nrelocs <= MAXRELOCS);
3686 
3687   for (i = 0; i < nrelocs; i++)
3688     {
3689       if (sym_must_create_stub (h, info))
3690 	{
3691 	  Elf_Internal_Rela outrel;
3692 	  asection * sreloc = globals->elf.srelgot;
3693 
3694 	  outrel.r_offset = stub_entry->stub_offset + stub_reloc_offset[i];
3695 	  outrel.r_info =
3696 	    ELF32_R_INFO (h->dynindx,
3697 			  template_sequence[stub_reloc_idx[i]].r_type);
3698 	  outrel.r_addend = template_sequence[stub_reloc_idx[i]].reloc_addend;
3699 
3700 	  loc = sreloc->contents;
3701 	  loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3702 
3703 	  if (loc != NULL)
3704 	    bfd_elf32_swap_reloca_out (info->output_bfd, &outrel, loc);
3705 	}
3706       _bfd_final_link_relocate (elf32_csky_howto_from_type
3707 				  (template_sequence[stub_reloc_idx[i]].r_type),
3708 				stub_bfd, stub_sec, stub_sec->contents,
3709 				stub_entry->stub_offset + stub_reloc_offset[i],
3710 				sym_value + stub_entry->target_addend,
3711 				template_sequence[stub_reloc_idx[i]].reloc_addend);
3712     }
3713 
3714   return TRUE;
3715 #undef MAXRELOCS
3716 }
3717 
3718 /* Build all the stubs associated with the current output file.  The
3719    stubs are kept in a hash table attached to the main linker hash
3720    table.  We also set up the .plt entries for statically linked PIC
3721    functions here.  This function is called via arm_elf_finish in the
3722    linker.  */
3723 
3724 bfd_boolean
3725 elf32_csky_build_stubs (struct bfd_link_info *info)
3726 {
3727   asection *stub_sec;
3728   struct bfd_hash_table *table;
3729   struct csky_elf_link_hash_table *htab;
3730 
3731   htab = csky_elf_hash_table (info);
3732 
3733   if (htab == NULL)
3734     return FALSE;
3735 
3736   for (stub_sec = htab->stub_bfd->sections;
3737        stub_sec != NULL;
3738        stub_sec = stub_sec->next)
3739     {
3740       bfd_size_type size;
3741 
3742       /* Ignore non-stub sections.  */
3743       if (!strstr (stub_sec->name, STUB_SUFFIX))
3744 	continue;
3745 
3746       /* Allocate memory to hold the linker stubs.  */
3747       size = stub_sec->size;
3748       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3749       if (stub_sec->contents == NULL && size != 0)
3750 	return FALSE;
3751       stub_sec->size = 0;
3752     }
3753 
3754   /* Build the stubs as directed by the stub hash table.  */
3755   table = &htab->stub_hash_table;
3756   bfd_hash_traverse (table, csky_build_one_stub, info);
3757 
3758   return TRUE;
3759 }
3760 
3761 /* Set up various things so that we can make a list of input sections
3762    for each output section included in the link.  Returns -1 on error,
3763    0 when no stubs will be needed, and 1 on success.  */
3764 
3765 int
3766 elf32_csky_setup_section_lists (bfd *output_bfd,
3767 				struct bfd_link_info *info)
3768 {
3769   bfd *input_bfd;
3770   unsigned int bfd_count;
3771   unsigned int top_id, top_index;
3772   asection *section;
3773   asection **input_list, **list;
3774   bfd_size_type amt;
3775   struct csky_elf_link_hash_table *htab = csky_elf_hash_table (info);
3776 
3777   if (!htab)
3778     return 0;
3779   if (! is_elf_hash_table (htab))
3780     return 0;
3781 
3782   /* Count the number of input BFDs and find the top input section id.  */
3783   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
3784        input_bfd != NULL;
3785        input_bfd = input_bfd->link.next)
3786     {
3787       bfd_count += 1;
3788       for (section = input_bfd->sections;
3789 	   section != NULL;
3790 	   section = section->next)
3791 	if (top_id < section->id)
3792 	  top_id = section->id;
3793     }
3794   htab->bfd_count = bfd_count;
3795   amt = sizeof (struct map_stub) * (top_id + 1);
3796   htab->stub_group = bfd_zmalloc (amt);
3797   if (htab->stub_group == NULL)
3798     return -1;
3799 
3800   /* We can't use output_bfd->section_count here to find the top output
3801      section index as some sections may have been removed, and
3802      _bfd_strip_section_from_output doesn't renumber the indices.  */
3803   for (section = output_bfd->sections, top_index = 0;
3804        section != NULL;
3805        section = section->next)
3806     if (top_index < section->index)
3807       top_index = section->index;
3808   htab->top_index = top_index;
3809   amt = sizeof (asection *) * (top_index + 1);
3810   input_list = bfd_malloc (amt);
3811   htab->input_list = input_list;
3812   if (input_list == NULL)
3813     return -1;
3814   /* For sections we aren't interested in, mark their entries with a
3815      value we can check later.  */
3816   list = input_list + top_index;
3817   do
3818     *list = bfd_abs_section_ptr;
3819   while (list-- != input_list);
3820   for (section = output_bfd->sections;
3821        section != NULL;
3822        section = section->next)
3823     if ((section->flags & SEC_CODE) != 0)
3824       input_list[section->index] = NULL;
3825 
3826   return 1;
3827 }
3828 
3829 static bfd_reloc_status_type
3830 csky_relocate_contents (reloc_howto_type *howto,
3831 			bfd *input_bfd,
3832 			long relocation,
3833 			bfd_byte *location)
3834 {
3835   int size;
3836   bfd_vma x = 0;
3837   bfd_reloc_status_type flag;
3838   unsigned int rightshift = howto->rightshift;
3839   unsigned int bitpos = howto->bitpos;
3840 
3841   /* If the size is negative, negate RELOCATION. This isn't very
3842      general.  */
3843   if (howto->size < 0)
3844     relocation = -relocation;
3845 
3846   /* FIXME: these macros should be defined at file head or head file head.  */
3847 #define CSKY_INSN_ADDI_TO_SUBI        0x04000000
3848 #define CSKY_INSN_MOV_RTB             0xc41d4820   // mov32 rx, r29, 0
3849 #define CSKY_INSN_MOV_RDB             0xc41c4820   // mov32 rx, r28, 0
3850 #define CSKY_INSN_GET_ADDI_RZ(x)      (((x) & 0x03e00000) >> 21)
3851 #define CSKY_INSN_SET_MOV_RZ(x)       ((x) & 0x0000001f)
3852 #define CSKY_INSN_JSRI_TO_LRW         0xea9a0000
3853 #define CSKY_INSN_JSR_R26             0xe8fa0000
3854 
3855   /* Get the value we are going to relocate.  */
3856   size = bfd_get_reloc_size (howto);
3857   switch (size)
3858     {
3859     default:
3860     case 0:
3861       abort ();
3862     case 1:
3863       x = bfd_get_8 (input_bfd, location);
3864       break;
3865     case 2:
3866       x = bfd_get_16 (input_bfd, location);
3867       break;
3868     case 4:
3869       if (need_reverse_bits)
3870 	{
3871 	  x = csky_get_insn_32 (input_bfd, location);
3872 
3873 	  if (R_CKCORE_DOFFSET_LO16 == howto->type)
3874 	    {
3875 	      if ((signed) relocation < 0)
3876 		{
3877 		  x |= CSKY_INSN_ADDI_TO_SUBI;
3878 		  relocation = -relocation;
3879 		}
3880 	      else if (0 == relocation)
3881 		x = (CSKY_INSN_MOV_RDB |
3882 		     CSKY_INSN_SET_MOV_RZ (CSKY_INSN_GET_ADDI_RZ (x)));
3883 	    }
3884 	  else if (R_CKCORE_TOFFSET_LO16 == howto->type)
3885 	    {
3886 	      if ((signed) relocation < 0)
3887 		{
3888 		  x |= CSKY_INSN_ADDI_TO_SUBI;
3889 		  relocation = -relocation;
3890 		}
3891 	      else if (0 == relocation)
3892 		x = (CSKY_INSN_MOV_RTB |
3893 		     CSKY_INSN_SET_MOV_RZ (CSKY_INSN_GET_ADDI_RZ (x)));
3894 	    }
3895 	}
3896       else
3897 	x = bfd_get_32 (input_bfd, location);
3898       break;
3899     }
3900   /* Check for overflow.  FIXME: We may drop bits during the addition
3901      which we don't check for.  We must either check at every single
3902      operation, which would be tedious, or we must do the computations
3903      in a type larger than bfd_vma, which would be inefficient.  */
3904   flag = bfd_reloc_ok;
3905   if (howto->complain_on_overflow != complain_overflow_dont)
3906     {
3907       int addrmask;
3908       int fieldmask;
3909       int signmask;
3910       int ss;
3911       int a;
3912       int b;
3913       int sum;
3914       /* Get the values to be added together.  For signed and unsigned
3915 	 relocations, we assume that all values should be truncated to
3916 	 the size of an address.  For bitfields, all the bits matter.
3917 	 See also bfd_check_overflow.  */
3918 #define N_ONES(n)      (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
3919       fieldmask = N_ONES (howto->bitsize);
3920       signmask  = ~fieldmask;
3921       addrmask  = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3922       a = (relocation & addrmask) >> rightshift;
3923       if (read_content_substitute)
3924 	x = read_content_substitute;
3925       b = (x & howto->src_mask & addrmask) >> bitpos;
3926 
3927       switch (howto->complain_on_overflow)
3928 	{
3929 	case complain_overflow_signed:
3930 	  /* If any sign bits are set, all sign bits must be set.
3931 	     That is, A must be a valid negative address after
3932 	     shifting.  */
3933 	  signmask = ~(fieldmask >> 1);
3934 	  /* Fall through.  */
3935 
3936 	case complain_overflow_bitfield:
3937 	  /* Much like the signed check, but for a field one bit
3938 	     wider.  We allow a bitfield to represent numbers in the
3939 	     range -2**n to 2**n-1, where n is the number of bits in the
3940 	     field.  Note that when bfd_vma is 32 bits, a 32-bit reloc
3941 	     can't overflow, which is exactly what we want.  */
3942 	  ss = a & signmask;
3943 	  if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
3944 	    flag = bfd_reloc_overflow;
3945 	  /* We only need this next bit of code if the sign bit of B
3946 	     is below the sign bit of A.  This would only happen if
3947 	     SRC_MASK had fewer bits than BITSIZE.  Note that if
3948 	     SRC_MASK has more bits than BITSIZE, we can get into
3949 	     trouble; we would need to verify that B is in range, as
3950 	     we do for A above.  */
3951 	  ss = ((~howto->src_mask) >> 1) & howto->src_mask;
3952 	  ss >>= bitpos;
3953 
3954 	  /* Set all the bits above the sign bit.  */
3955 	  b = (b ^ ss) - ss;
3956 
3957 	  /* Now we can do the addition.  */
3958 	  sum = a + b;
3959 
3960 	  /* See if the result has the correct sign.  Bits above the
3961 	     sign bit are junk now; ignore them.  If the sum is
3962 	     positive, make sure we did not have all negative inputs;
3963 	     if the sum is negative, make sure we did not have all
3964 	     positive inputs.  The test below looks only at the sign
3965 	     bits, and it really just
3966 	     SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
3967 
3968 	     We mask with addrmask here to explicitly allow an address
3969 	     wrap-around.  The Linux kernel relies on it, and it is
3970 	     the only way to write assembler code which can run when
3971 	     loaded at a location 0x80000000 away from the location at
3972 	     which it is linked.  */
3973 
3974 	  if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
3975 	    flag = bfd_reloc_overflow;
3976 	  break;
3977 	case complain_overflow_unsigned:
3978 	  /* Checking for an unsigned overflow is relatively easy:
3979 	     trim the addresses and add, and trim the result as well.
3980 	     Overflow is normally indicated when the result does not
3981 	     fit in the field.  However, we also need to consider the
3982 	     case when, e.g., fieldmask is 0x7fffffff or smaller, an
3983 	     input is 0x80000000, and bfd_vma is only 32 bits; then we
3984 	     will get sum == 0, but there is an overflow, since the
3985 	     inputs did not fit in the field.  Instead of doing a
3986 	     separate test, we can check for this by or-ing in the
3987 	     operands when testing for the sum overflowing its final
3988 	     field.  */
3989 	  sum = (a + b) & addrmask;
3990 	  if ((a | b | sum) & signmask)
3991 	    flag = bfd_reloc_overflow;
3992 	  break;
3993 	default:
3994 	  abort ();
3995 	}
3996 
3997     }
3998   /* Put RELOCATION in the right bits.  */
3999   relocation >>= (bfd_vma) rightshift;
4000 
4001   if ((howto->type == R_CKCORE_DOFFSET_LO16
4002        || howto->type == R_CKCORE_TOFFSET_LO16)
4003       && relocation == 0)
4004     /* Do nothing lsli32 rx, rz, 0.  */
4005     ;
4006   else
4007     {
4008       /* Fir V1, all this relocation must be x -1.  */
4009       if (howto->type == R_CKCORE_PCREL_IMM11BY2
4010 	  || howto->type == R_CKCORE_PCREL_JSR_IMM11BY2
4011 	  || howto->type == R_CKCORE_DOFFSET_LO16
4012 	  || howto->type == R_CKCORE_TOFFSET_LO16)
4013 	relocation -= 1;
4014       else if (howto->type == R_CKCORE_PCREL_IMM7BY4)
4015 	relocation = (relocation & 0x1f) + ((relocation << 3) & 0x300);
4016       else if (howto->type == R_CKCORE_PCREL_FLRW_IMM8BY4)
4017 	relocation
4018 	  = ((relocation << 4) & 0xf0) + ((relocation << 17) & 0x1e00000);
4019       else if (howto->type == R_CKCORE_NOJSRI)
4020 	{
4021 	  x = (x & howto->dst_mask) | CSKY_INSN_JSRI_TO_LRW;
4022 	  relocation = 0;
4023 	  csky_put_insn_32 (input_bfd, CSKY_INSN_JSR_R26, location + 4);
4024 	}
4025 
4026       relocation <<= (bfd_vma) bitpos;
4027       /* Add RELOCATION to the right bits of X.  */
4028       x = ((x & ~howto->dst_mask)
4029 	   | (((x & howto->src_mask) + relocation) & howto->dst_mask));
4030     }
4031   /* Put the relocated value back in the object file.  */
4032   switch (size)
4033     {
4034     default:
4035       abort ();
4036     case 1:
4037       bfd_put_8 (input_bfd, x, location);
4038       break;
4039     case 2:
4040       bfd_put_16 (input_bfd, x, location);
4041       break;
4042     case 4:
4043       if (need_reverse_bits)
4044 	csky_put_insn_32 (input_bfd, x, location);
4045       else
4046 	bfd_put_32 (input_bfd, x, location);
4047       break;
4048     }
4049   return flag;
4050 }
4051 
4052 /* Look up an entry in the stub hash. Stub entries are cached because
4053    creating the stub name takes a bit of time.  */
4054 
4055 static struct elf32_csky_stub_hash_entry *
4056 elf32_csky_get_stub_entry (const asection *input_section,
4057 			   const asection *sym_sec,
4058 			   struct elf_link_hash_entry *hash,
4059 			   const Elf_Internal_Rela *rel,
4060 			   struct csky_elf_link_hash_table *htab)
4061 {
4062   struct elf32_csky_stub_hash_entry *stub_entry;
4063   struct csky_elf_link_hash_entry *h
4064     = (struct csky_elf_link_hash_entry *) hash;
4065   const asection *id_sec;
4066 
4067   if ((input_section->flags & SEC_CODE) == 0)
4068     return NULL;
4069 
4070   /* If this input section is part of a group of sections sharing one
4071      stub section, then use the id of the first section in the group.
4072      Stub names need to include a section id, as there may well be
4073      more than one stub used to reach say, printf, and we need to
4074      distinguish between them.  */
4075   id_sec = htab->stub_group[input_section->id].link_sec;
4076   if (h != NULL && h->stub_cache != NULL
4077       && h->stub_cache->h == h && h->stub_cache->id_sec == id_sec)
4078     stub_entry = h->stub_cache;
4079   else
4080     {
4081       char *stub_name;
4082       stub_name = elf32_csky_stub_name (id_sec, sym_sec, h, rel);
4083       if (stub_name == NULL)
4084 	return NULL;
4085       stub_entry = csky_stub_hash_lookup (&htab->stub_hash_table,
4086 					  stub_name, FALSE, FALSE);
4087       if (h != NULL)
4088 	h->stub_cache = stub_entry;
4089       free (stub_name);
4090     }
4091 
4092   return stub_entry;
4093 }
4094 
4095 static bfd_reloc_status_type
4096 csky_final_link_relocate (reloc_howto_type *howto,
4097 			  bfd *input_bfd,
4098 			  asection *input_section,
4099 			  bfd_byte *contents,
4100 			  bfd_vma address,
4101 			  bfd_vma value,
4102 			  bfd_vma addend)
4103 {
4104   bfd_vma relocation;
4105 
4106   /* Sanity check the address.  */
4107   if (address > bfd_get_section_limit (input_bfd, input_section))
4108     return bfd_reloc_outofrange;
4109 
4110   /* This function assumes that we are dealing with a basic relocation
4111      against a symbol. We want to compute the value of the symbol to
4112      relocate to. This is just VALUE, the value of the symbol,
4113      plus ADDEND, any addend associated with the reloc.  */
4114   relocation = value + addend;
4115 
4116   /* If the relocation is PC relative, we want to set RELOCATION to
4117      the distance between the symbol (currently in RELOCATION) and the
4118      location we are relocating. Some targets (e.g., i386-aout)
4119      arrange for the contents of the section to be the negative of the
4120      offset of the location within the section; for such targets
4121      pcrel_offset is FALSE.  Other targets (e.g., m88kbcs or ELF)
4122      simply leave the contents of the section as zero; for such
4123      targets pcrel_offset is TRUE.  If pcrel_offset is FALSE we do not
4124      need to subtract out the offset of the location within the
4125      section (which is just ADDRESS).  */
4126   if (howto->pc_relative)
4127     {
4128       relocation -= (input_section->output_section->vma
4129 		     + input_section->output_offset);
4130       if (howto->pcrel_offset)
4131 	relocation -= address;
4132     }
4133 
4134   return csky_relocate_contents (howto, input_bfd, relocation,
4135 				 contents + address);
4136 
4137 }
4138 
4139 /* Return the base VMA address which should be subtracted from real addresses
4140    when resolving @dtpoff relocation.
4141    This is PT_TLS segment p_vaddr.  */
4142 
4143 static bfd_vma
4144 dtpoff_base (struct bfd_link_info *info)
4145 {
4146   /* If tls_sec is NULL, we should have signalled an error already.  */
4147   if (elf_hash_table (info)->tls_sec == NULL)
4148     return 0;
4149   return elf_hash_table (info)->tls_sec->vma;
4150 }
4151 
4152 /* Return the relocation value for @tpoff relocation
4153    if STT_TLS virtual address is ADDRESS.  */
4154 
4155 static bfd_vma
4156 tpoff (struct bfd_link_info *info, bfd_vma address)
4157 {
4158   struct elf_link_hash_table *htab = elf_hash_table (info);
4159   bfd_vma base;
4160 
4161   /* If tls_sec is NULL, we should have signalled an error already.  */
4162   if (htab->tls_sec == NULL)
4163     return 0;
4164   base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
4165   return address - htab->tls_sec->vma + base;
4166 }
4167 
4168 /* Relocate a csky section.  */
4169 
4170 static bfd_boolean
4171 csky_elf_relocate_section (bfd *                  output_bfd,
4172 			   struct bfd_link_info * info,
4173 			   bfd *                  input_bfd,
4174 			   asection *             input_section,
4175 			   bfd_byte *             contents,
4176 			   Elf_Internal_Rela *    relocs,
4177 			   Elf_Internal_Sym *     local_syms,
4178 			   asection **            local_sections)
4179 {
4180   Elf_Internal_Shdr *symtab_hdr;
4181   struct elf_link_hash_entry **sym_hashes;
4182   Elf_Internal_Rela *rel;
4183   Elf_Internal_Rela *relend;
4184   const char *name;
4185   bfd_boolean ret = TRUE;
4186   struct csky_elf_link_hash_table * htab;
4187   bfd_vma *local_got_offsets = elf_local_got_offsets (input_bfd);
4188 
4189   htab = csky_elf_hash_table (info);
4190   if (htab == NULL)
4191     return FALSE;
4192 
4193   symtab_hdr = & elf_symtab_hdr (input_bfd);
4194   sym_hashes = elf_sym_hashes (input_bfd);
4195 
4196   rel = relocs;
4197   relend = relocs + input_section->reloc_count;
4198   for (; rel < relend; rel++)
4199     {
4200       enum elf_csky_reloc_type     r_type
4201 	= (enum elf_csky_reloc_type) ELF32_R_TYPE (rel->r_info);
4202       unsigned long                r_symndx;
4203       reloc_howto_type *           howto;
4204       Elf_Internal_Sym *           sym;
4205       asection *                   sec;
4206       bfd_vma                      relocation;
4207       bfd_vma                      off;
4208       struct elf_link_hash_entry * h;
4209       bfd_vma                      addend = (bfd_vma)rel->r_addend;
4210       bfd_reloc_status_type        r = bfd_reloc_ok;
4211       bfd_boolean                  unresolved_reloc = FALSE;
4212       int                          do_final_relocate = TRUE;
4213       bfd_boolean                  relative_reloc = FALSE;
4214       bfd_signed_vma disp;
4215 
4216       /* Ignore these relocation types:
4217 	 R_CKCORE_GNU_VTINHERIT, R_CKCORE_GNU_VTENTRY.  */
4218       if (r_type == R_CKCORE_GNU_VTINHERIT || r_type == R_CKCORE_GNU_VTENTRY)
4219 	continue;
4220 
4221       if ((unsigned) r_type >= (unsigned) R_CKCORE_MAX)
4222 	{
4223 	  /* The r_type is error, not support it.  */
4224 	  /* xgettext:c-format */
4225 	  _bfd_error_handler (_("%pB: unsupported relocation type: %#x"),
4226 			      input_bfd, r_type);
4227 	  bfd_set_error (bfd_error_bad_value);
4228 	  ret = FALSE;
4229 	  continue;
4230 	}
4231 
4232       howto = &csky_elf_howto_table[(int) r_type];
4233 
4234       r_symndx = ELF32_R_SYM(rel->r_info);
4235       h = NULL;
4236       sym = NULL;
4237       sec = NULL;
4238       unresolved_reloc = FALSE;
4239 
4240       if (r_symndx < symtab_hdr->sh_info)
4241 	{
4242 	  /* Get symbol table entry.  */
4243 	  sym = local_syms + r_symndx;
4244 	  sec = local_sections[r_symndx];
4245 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4246 	  addend = (bfd_vma)rel->r_addend;
4247 	}
4248       else
4249 	{
4250 	  bfd_boolean warned, ignored;
4251 
4252 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4253 				   r_symndx, symtab_hdr, sym_hashes,
4254 				   h, sec, relocation,
4255 				   unresolved_reloc, warned, ignored);
4256 	}
4257 
4258       if (sec != NULL && discarded_section (sec))
4259 	{
4260 	  /* For relocs against symbols from removed linkonce sections,
4261 	     or sections discarded by a linker script, we just want the
4262 	     section contents zeroed.  Avoid any special processing.
4263 	     And if the symbol is referenced in '.csky_stack_size' section,
4264 	     set the address to SEC_DISCARDED(0xffffffff).  */
4265 #if 0
4266 	  /* The .csky_stack_size section is just for callgraph.  */
4267 	  if (strcmp (input_section->name, ".csky_stack_size") == 0)
4268 	    {
4269 /* FIXME: it should define in head file.  */
4270 #define SEC_DISCARDED   0xffffffff
4271 	      bfd_put_32 (input_bfd, SEC_DISCARDED, contents + rel->r_offset);
4272 	      rel->r_info = 0;
4273 	      rel->r_addend = 0;
4274 	      continue;
4275 	    }
4276 	  else
4277 #endif
4278 	    RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4279 					     rel, 1, relend, howto, 0,
4280 					     contents);
4281 	}
4282 
4283       if (bfd_link_relocatable (info))
4284 	continue;
4285 
4286       read_content_substitute = 0;
4287 
4288       /* Final link.  */
4289       disp = (relocation
4290 	      + (bfd_signed_vma) addend
4291 	      - input_section->output_section->vma
4292 	      - input_section->output_offset
4293 	      - rel->r_offset);
4294 /* It is for ck8xx.  */
4295 #define CSKY_INSN_BSR32   0xe0000000
4296 /* It is for ck5xx/ck6xx.  */
4297 #define CSKY_INSN_BSR16   0xf800
4298 #define within_range(x, L)  (-(1 << (L - 1)) < (x) && (x) < (1 << (L -1)) - 2)
4299       switch (howto->type)
4300 	{
4301 	case R_CKCORE_PCREL_IMM18BY2:
4302 	  /* When h is NULL, means the instruction written as
4303 	     grs rx, imm32
4304 	     if the highest bit is set, prevent the high 32bits
4305 	     turn to 0xffffffff when signed extern in 64bit
4306 	     host machine.  */
4307 	  if (h == NULL && (addend & 0x80000000))
4308 	    addend &= 0xffffffff;
4309 	  break;
4310 
4311 	case R_CKCORE_PCREL32:
4312 	  break;
4313 
4314 	case R_CKCORE_GOT12:
4315 	case R_CKCORE_PLT12:
4316 	case R_CKCORE_GOT_HI16:
4317 	case R_CKCORE_GOT_LO16:
4318 	case R_CKCORE_PLT_HI16:
4319 	case R_CKCORE_PLT_LO16:
4320 	case R_CKCORE_GOT32:
4321 	case R_CKCORE_GOT_IMM18BY4:
4322 	  /* Relocation is to the entry for this symbol in the global
4323 	     offset table.  */
4324 	  BFD_ASSERT (htab->elf.sgot != NULL);
4325 	  if (h != NULL)
4326 	    {
4327 	      /* Global symbol is defined by other modules.  */
4328 	      bfd_boolean dyn;
4329 	      off = h->got.offset;
4330 	      dyn = htab->elf.dynamic_sections_created;
4331 	      if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4332 						    bfd_link_pic (info), h)
4333 		  || (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info,h))
4334 		  || (ELF_ST_VISIBILITY(h->other)
4335 		      && h->root.type == bfd_link_hash_undefweak))
4336 		{
4337 		  /* This is actually a static link, or it is a
4338 		     -Bsymbolic link and the symbol is defined
4339 		     locally, or the symbol was forced to be local
4340 		     because of a version file.  We must initialize
4341 		     this entry in the global offset table.  Since the
4342 		     offset must always be a multiple of 4, we use the
4343 		     least significant bit to record whether we have
4344 		     initialized it already.
4345 		     When doing a dynamic link, we create a .rela.dyn
4346 		     relocation entry to initialize the value.  This
4347 		     is done in the finish_dynamic_symbol routine. FIXME  */
4348 		  if (off & 1)
4349 		    off &= ~1;
4350 		  else
4351 		    {
4352 		      bfd_put_32 (output_bfd, relocation,
4353 				  htab->elf.sgot->contents + off);
4354 		      h->got.offset |= 1;
4355 
4356 /* TRUE if relative relocation should be generated.  GOT reference to
4357    global symbol in PIC will lead to dynamic symbol.  It becomes a
4358    problem when "time" or "times" is defined as a variable in an
4359    executable, clashing with functions of the same name in libc.  If a
4360    symbol isn't undefined weak symbol, don't make it dynamic in PIC and
4361    generate relative relocation.  */
4362 #define GENERATE_RELATIVE_RELOC_P(INFO, H) \
4363   ((H)->dynindx == -1 \
4364    && !(H)->forced_local \
4365    && (H)->root.type != bfd_link_hash_undefweak \
4366    && bfd_link_pic (INFO))
4367 
4368 		      if (GENERATE_RELATIVE_RELOC_P (info, h))
4369 			/* If this symbol isn't dynamic
4370 			   in PIC, generate R_CKCORE_RELATIVE here.  */
4371 			relative_reloc = TRUE;
4372 		    }
4373 		}
4374 	      else
4375 		unresolved_reloc = FALSE;
4376 	    } /* End if h != NULL.  */
4377 	  else
4378 	    {
4379 	      BFD_ASSERT (local_got_offsets != NULL);
4380 	      off = local_got_offsets[r_symndx];
4381 
4382 	      /* The offset must always be a multiple of 4.  We use
4383 		 the least significant bit to record whether we have
4384 		 already generated the necessary reloc.  */
4385 	      if (off & 1)
4386 		off &= ~1;
4387 	      else
4388 		{
4389 		  bfd_put_32 (output_bfd, relocation,
4390 			      htab->elf.sgot->contents + off);
4391 		  local_got_offsets[r_symndx] |= 1;
4392 		  if (bfd_link_pic (info))
4393 		    relative_reloc = TRUE;
4394 		}
4395 	    }
4396 	  if (relative_reloc)
4397 	    {
4398 	      asection *srelgot;
4399 	      Elf_Internal_Rela outrel;
4400 	      bfd_byte *loc;
4401 
4402 	      srelgot = htab->elf.srelgot;
4403 	      BFD_ASSERT (srelgot != NULL);
4404 
4405 	      outrel.r_offset
4406 		= (htab->elf.sgot->output_section->vma
4407 		   + htab->elf.sgot->output_offset  + off);
4408 	      outrel.r_info = ELF32_R_INFO (0, R_CKCORE_RELATIVE);
4409 	      outrel.r_addend = relocation;
4410 	      loc = srelgot->contents;
4411 	      loc += (srelgot->reloc_count++ * sizeof (Elf32_External_Rela));
4412 	      if (loc != NULL)
4413 		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4414 	    }
4415 	  relocation = htab->elf.sgot->output_offset + off;
4416 	  break;
4417 
4418 	case R_CKCORE_GOTOFF_IMM18:
4419 	case R_CKCORE_GOTOFF:
4420 	case R_CKCORE_GOTOFF_HI16:
4421 	case R_CKCORE_GOTOFF_LO16:
4422 	  /* Relocation is relative to the start of the global offset
4423 	     table.  */
4424 	  /* Note that sgot->output_offset is not involved in this
4425 	     calculation.  We always want the start of .got.  If we
4426 	     defined _GLOBAL_OFFSET_TABLE in a different way, as is
4427 	     permitted by the ABI, we might have to change this
4428 	     calculation.  */
4429 	  relocation -= htab->elf.sgot->output_section->vma;
4430 	  break;
4431 
4432 	case R_CKCORE_GOTPC:
4433 	case R_CKCORE_GOTPC_HI16:
4434 	case R_CKCORE_GOTPC_LO16:
4435 	  /* Use global offset table as symbol value.  */
4436 	  relocation = htab->elf.sgot->output_section->vma;
4437 	  addend = -addend;
4438 	  unresolved_reloc = FALSE;
4439 	  break;
4440 
4441 	case R_CKCORE_DOFFSET_IMM18:
4442 	case R_CKCORE_DOFFSET_IMM18BY2:
4443 	case R_CKCORE_DOFFSET_IMM18BY4:
4444 	  {
4445 	    asection *sdata = bfd_get_section_by_name (output_bfd, ".data");
4446 	    relocation -= sdata->output_section->vma;
4447 	  }
4448 	  break;
4449 
4450 	case R_CKCORE_DOFFSET_LO16:
4451 	  {
4452 	    asection *sdata = bfd_get_section_by_name (output_bfd, ".data");
4453 	    relocation -= sdata->output_section->vma;
4454 	  }
4455 	  break;
4456 
4457 	case R_CKCORE_TOFFSET_LO16:
4458 	  {
4459 	    asection *stext = bfd_get_section_by_name (output_bfd, ".text");
4460 	    if (stext)
4461 	      relocation -= stext->output_section->vma;
4462 	  }
4463 	  break;
4464 
4465 	case R_CKCORE_PLT_IMM18BY4:
4466 	case R_CKCORE_PLT32:
4467 	  /* Relocation is to the entry for this symbol in the
4468 	     procedure linkage table.  */
4469 
4470 	  /* Resolve a PLT32 reloc against a local symbol directly,
4471 	     without using the procedure linkage table.  */
4472 	  if (h == NULL)
4473 	    break;
4474 
4475 	  if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
4476 	    {
4477 	      /* We didn't make a PLT entry for this symbol.  This
4478 		 happens when statically linking PIC code, or when
4479 		 using -Bsymbolic.  */
4480 	      if (h->got.offset != (bfd_vma) -1)
4481 		{
4482 		  bfd_boolean dyn;
4483 
4484 		  off = h->got.offset;
4485 		  dyn = htab->elf.dynamic_sections_created;
4486 		  if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4487 							bfd_link_pic (info), h)
4488 		      || (bfd_link_pic (info)
4489 			  && SYMBOL_REFERENCES_LOCAL (info, h))
4490 		      || (ELF_ST_VISIBILITY (h->other)
4491 			  && h->root.type == bfd_link_hash_undefweak))
4492 		    {
4493 		      /* This is actually a static link, or it is a
4494 			 -Bsymbolic link and the symbol is defined
4495 			 locally, or the symbol was forced to be local
4496 			 because of a version file.  We must initialize
4497 			 this entry in the global offset table.  Since the
4498 			 offset must always be a multiple of 4, we use the
4499 			 least significant bit to record whether we have
4500 			 initialized it already.
4501 
4502 			 When doing a dynamic link, we create a .rela.dyn
4503 			 relocation entry to initialize the value.  This
4504 			 is done in the finish_dynamic_symbol routine.
4505 			 FIXME!  */
4506 		      if (off & 1)
4507 			off &= ~1;
4508 		      else
4509 			{
4510 			  h->got.offset |= 1;
4511 			  if (GENERATE_RELATIVE_RELOC_P (info, h))
4512                             relative_reloc = TRUE;
4513 			}
4514 		    }
4515 		  bfd_put_32 (output_bfd, relocation,
4516 			      htab->elf.sgot->contents + off);
4517 
4518 		  if (relative_reloc)
4519 		    {
4520 		      asection *srelgot;
4521 		      Elf_Internal_Rela outrel;
4522 		      bfd_byte *loc;
4523 
4524 		      srelgot = htab->elf.srelgot;
4525 		      BFD_ASSERT (srelgot != NULL);
4526 
4527 		      outrel.r_offset
4528 			= (htab->elf.sgot->output_section->vma
4529 			   + htab->elf.sgot->output_offset  + off);
4530 		      outrel.r_info = ELF32_R_INFO (0, R_CKCORE_RELATIVE);
4531 		      outrel.r_addend = relocation;
4532 		      loc = srelgot->contents;
4533 		      loc += (srelgot->reloc_count++
4534 			      * sizeof (Elf32_External_Rela));
4535 		      if (loc != NULL)
4536 			bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4537 		    }
4538 		  relocation = off + htab->elf.sgot->output_offset;
4539 		}
4540 	      break;
4541 	    }
4542 	  /* The relocation is the got offset.  */
4543 	  if (bfd_csky_abi (output_bfd) == CSKY_ABI_V2)
4544 	    relocation = (h->plt.offset / PLT_ENTRY_SIZE + 2) * 4;
4545 	  else
4546 	    relocation = (h->plt.offset / PLT_ENTRY_SIZE_P + 2) * 4;
4547 	  unresolved_reloc = FALSE;
4548 	  break;
4549 
4550 	case R_CKCORE_PCREL_IMM26BY2:
4551 	case R_CKCORE_PCREL_JSR_IMM26BY2:
4552 	case R_CKCORE_PCREL_JSR_IMM11BY2:
4553 	case R_CKCORE_PCREL_IMM11BY2:
4554 	case R_CKCORE_CALLGRAPH:
4555 	  /* Emit callgraph information first.  */
4556 	  /* TODO: deal with callgraph.  */
4557 	  if (ELF32_R_TYPE (rel->r_info) == R_CKCORE_CALLGRAPH)
4558 	    break;
4559 	  /* Some reloc need further handling.  */
4560 	  /* h == NULL means the symbol is a local symbol,
4561 	     r_symndx == 0 means the symbol is 'ABS' and
4562 	     the relocation is already handled in assemble,
4563 	     here just use for callgraph.  */
4564 	  /* TODO: deal with callgraph.  */
4565 	  if (h == NULL && r_symndx == 0)
4566 	    {
4567 	      do_final_relocate = FALSE;
4568 	      break;
4569 	    }
4570 
4571 	  /* Ignore weak references to undefined symbols.  */
4572 	  if (h != NULL && h->root.type == bfd_link_hash_undefweak)
4573 	    {
4574 	      do_final_relocate = FALSE;
4575 	      break;
4576 	    }
4577 
4578 	  /* Using branch stub.  */
4579 	  if (use_branch_stub == TRUE
4580 	      && ELF32_R_TYPE (rel->r_info) == R_CKCORE_PCREL_IMM26BY2)
4581 	    {
4582 	      struct elf32_csky_stub_hash_entry *stub_entry = NULL;
4583 	      if (sym_must_create_stub (h, info))
4584 		stub_entry = elf32_csky_get_stub_entry (input_section,
4585 							input_section,
4586 							h, rel, htab);
4587 	      else if (disp > BSR_MAX_FWD_BRANCH_OFFSET
4588 		       || disp < BSR_MAX_BWD_BRANCH_OFFSET)
4589 		stub_entry = elf32_csky_get_stub_entry (input_section,
4590 							input_section,
4591 							h, rel, htab);
4592 	      if (stub_entry != NULL)
4593 		relocation
4594 		  = (stub_entry->stub_offset
4595 		     + stub_entry->stub_sec->output_offset
4596 		     + stub_entry->stub_sec->output_section->vma);
4597 	      break;
4598 	    }
4599 
4600 	  else if (h == NULL
4601 		   || (h->root.type == bfd_link_hash_defined
4602 		       && h->dynindx == -1)
4603 		   || ((h->def_regular && !h->def_dynamic)
4604 		       && (h->root.type != bfd_link_hash_defweak
4605 			   || ! bfd_link_pic (info))))
4606 	    {
4607 	      if (ELF32_R_TYPE (rel->r_info) == R_CKCORE_PCREL_JSR_IMM26BY2)
4608 		{
4609 		  if (within_range (disp, 26))
4610 		    {
4611 		      /* In range for BSR32.  */
4612 		      howto = &csky_elf_howto_table[R_CKCORE_PCREL_IMM26BY2];
4613 		      read_content_substitute = CSKY_INSN_BSR32;
4614 		    }
4615 		  else if (bfd_csky_arch (output_bfd) == CSKY_ARCH_810)
4616 		    /* if bsr32 cannot reach, generate
4617 		       "lrw r25, label; jsr r25" instead of
4618 		       jsri label.  */
4619 		    howto = &csky_elf_howto_table[R_CKCORE_NOJSRI];
4620 		} /* if ELF32_R_TYPE (rel->r_info)...  */
4621 	      else if (ELF32_R_TYPE (rel->r_info)
4622 		       == R_CKCORE_PCREL_JSR_IMM11BY2)
4623 		{
4624 		  if (within_range (disp, 11))
4625 		    {
4626 		      /* In range for BSR16.  */
4627 		      howto = &csky_elf_howto_table[R_CKCORE_PCREL_IMM11BY2];
4628 		      read_content_substitute = CSKY_INSN_BSR16;
4629 		    }
4630 		}
4631 	      break;
4632 	    } /* else if h == NULL...  */
4633 
4634 	  else if (bfd_csky_arch (output_bfd) == CSKY_ARCH_810
4635 		   && (ELF32_R_TYPE (rel->r_info)
4636 		       == R_CKCORE_PCREL_JSR_IMM26BY2))
4637 	    {
4638 	      howto = &csky_elf_howto_table[R_CKCORE_NOJSRI];
4639 	      break;
4640 	    }
4641 	  /* Other situation, h->def_dynamic == 1,
4642 	     undefined_symbol when output file is shared object, etc.  */
4643 	  /* Else fall through.  */
4644 
4645 	case R_CKCORE_ADDR_HI16:
4646 	case R_CKCORE_ADDR_LO16:
4647 	  if (bfd_link_pic (info)
4648 	      || (!bfd_link_pic (info)
4649 		  && h != NULL
4650 		  && h->dynindx != -1
4651 		  && !h->non_got_ref
4652 		  && ((h->def_dynamic && !h->def_regular)
4653 		      || (htab->elf.dynamic_sections_created
4654 			  && (h->root.type == bfd_link_hash_undefweak
4655 			      || h->root.type == bfd_link_hash_undefined
4656 			      || h->root.type == bfd_link_hash_indirect)))))
4657 	    {
4658 	      Elf_Internal_Rela outrel;
4659 	      bfd_boolean skip, relocate;
4660 	      bfd_byte *loc;
4661 
4662 	      /* When generating a shared object, these relocations
4663 		 are copied into the output file to be resolved at
4664 		 run time.  */
4665 	      skip = FALSE;
4666 	      relocate = FALSE;
4667 
4668 	      outrel.r_offset =
4669 		_bfd_elf_section_offset (output_bfd, info, input_section,
4670 					 rel->r_offset);
4671 	      if (outrel.r_offset == (bfd_vma) -1)
4672 		skip = TRUE;
4673 	      else if (outrel.r_offset == (bfd_vma) -2)
4674 		{
4675 		  skip = TRUE;
4676 		  relocate = TRUE;
4677 		}
4678 	      outrel.r_offset += (input_section->output_section->vma
4679 				  + input_section->output_offset);
4680 	      if (skip)
4681 		memset (&outrel, 0, sizeof (outrel));
4682 	      else if (h != NULL
4683 		       && h->dynindx != -1
4684 		       && (!bfd_link_pic (info)
4685 			   || (!SYMBOLIC_BIND (info, h)
4686 			       && h->root.type == bfd_link_hash_defweak)
4687 			   || !h->def_regular))
4688 		{
4689 		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4690 		  outrel.r_addend = rel->r_addend;
4691 		}
4692 	      else
4693 		{
4694 		  /* This symbol is local, or marked to become local.  */
4695 		  relocate = TRUE;
4696 		  outrel.r_info = ELF32_R_INFO (0, r_type);
4697 		  outrel.r_addend = relocation + rel->r_addend;
4698 		}
4699 	      loc = htab->elf.srelgot->contents;
4700 	      loc += (htab->elf.srelgot->reloc_count++
4701 		      * sizeof (Elf32_External_Rela));
4702 
4703 	      if (loc != NULL)
4704 		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4705 
4706 	      /* If this reloc is against an external symbol, we do not
4707 		 want to diddle with the addend. Otherwise, we need to
4708 		 include the symbol value so that it becomes an addend
4709 		 for the dynamic reloc.  */
4710 	      if (!relocate)
4711 		continue;
4712 	    } /* if bfd_link_pic (info) ...  */
4713 	  break;
4714 
4715 	case R_CKCORE_ADDR32:
4716 	  /* r_symndx will be zero only for relocs against symbols
4717 	     from removed linkonce sections, or sections discarded
4718 	     by a linker script.
4719 	     This relocation don't nedd to handle, the value will
4720 	     be set to SEC_DISCARDED(0xffffffff).  */
4721 	  if (r_symndx == 0
4722 	      && strcmp (sec->name, ".csky_stack_size") == 0)
4723 	    {
4724 	      do_final_relocate = FALSE;
4725 	      break;
4726 	    }
4727 	  if (r_symndx >= symtab_hdr->sh_info
4728 	      && h->non_got_ref
4729 	      && bfd_link_executable (info))
4730 	    break;
4731 
4732 	  if (r_symndx == 0 || (input_section->flags & SEC_ALLOC) == 0)
4733 	    break;
4734 
4735 	  if (bfd_link_pic (info)
4736 	      || (h != NULL
4737 		  && h->dynindx != -1
4738 		  && ((h->def_dynamic && !h->def_regular)
4739 		      || (htab->elf.dynamic_sections_created
4740 			  && (h->root.type == bfd_link_hash_undefweak
4741 			      || h->root.type == bfd_link_hash_undefined
4742 			      || h->root.type == bfd_link_hash_indirect)))))
4743 	    {
4744 	      Elf_Internal_Rela outrel;
4745 	      bfd_boolean skip, relocate;
4746 	      bfd_byte *loc;
4747 
4748 	      /* When generating a shared object, these relocations
4749 		 are copied into the output file to be resolved at
4750 		 run time.  */
4751 	      skip = FALSE;
4752 	      relocate = FALSE;
4753 
4754 	      outrel.r_offset =
4755 		_bfd_elf_section_offset (output_bfd, info, input_section,
4756 					 rel->r_offset);
4757 
4758 	      if (outrel.r_offset == (bfd_vma) -1)
4759 		skip = TRUE;
4760 	      else if (outrel.r_offset == (bfd_vma) -2)
4761 		{
4762 		  skip = TRUE;
4763 		  relocate = TRUE;
4764 		}
4765 
4766 	      outrel.r_offset += (input_section->output_section->vma
4767 				  + input_section->output_offset);
4768 
4769 	      if (skip)
4770 		memset (&outrel, 0, sizeof (outrel));
4771 	      else if (h != NULL
4772 		       && h->dynindx != -1
4773 		       && (!bfd_link_pic (info)
4774 			   || (!SYMBOLIC_BIND (info, h)
4775 			       && h->root.type == bfd_link_hash_defweak)
4776 			   || !h->def_regular))
4777 		{
4778 		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4779 		  outrel.r_addend = rel->r_addend;
4780 		}
4781 	      else
4782 		{
4783 		  /* This symbol is local, or marked to become local.  */
4784 		  outrel.r_info = ELF32_R_INFO (0, R_CKCORE_RELATIVE);
4785 		  outrel.r_addend = relocation + rel->r_addend;
4786 		}
4787 
4788 	      loc = htab->elf.srelgot->contents;
4789 	      loc += (htab->elf.srelgot->reloc_count++
4790 		      * sizeof (Elf32_External_Rela));
4791 
4792 	      if (loc != NULL)
4793 		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4794 
4795 	      /* If this reloc is against an external symbol, we do
4796 		 want to diddle with the addend. Otherwise, we need to
4797 		 include the symbol value so that it becomes an addend
4798 		 for the dynamic reloc.  */
4799 	      if (! relocate)
4800 		continue;
4801 	    }
4802 	  break;
4803 
4804 	case R_CKCORE_TLS_LDO32:
4805 	  relocation = relocation - dtpoff_base (info);
4806 	  break;
4807 
4808 	case R_CKCORE_TLS_LDM32:
4809 	  BFD_ASSERT (htab->elf.sgot != NULL);
4810 	  off = htab->tls_ldm_got.offset;
4811 	  if (off & 1)
4812 	    off &= ~1;
4813 	  else
4814 	    {
4815 	      /* If we don't know the module number,
4816 		 create a relocation for it.  */
4817 	      if (!bfd_link_executable (info))
4818 		{
4819 		  Elf_Internal_Rela outrel;
4820 		  bfd_byte *loc;
4821 
4822 		  BFD_ASSERT (htab->elf.srelgot != NULL);
4823 		  outrel.r_addend = 0;
4824 		  outrel.r_offset
4825 		    = (htab->elf.sgot->output_section->vma
4826 		       + htab->elf.sgot->output_offset + off);
4827 		  outrel.r_info = ELF32_R_INFO (0, R_CKCORE_TLS_DTPMOD32);
4828 		  bfd_put_32 (output_bfd, outrel.r_addend,
4829 			      htab->elf.sgot->contents + off);
4830 
4831 		  loc = htab->elf.srelgot->contents;
4832 		  loc += (htab->elf.srelgot->reloc_count++
4833 			  * sizeof (Elf32_External_Rela));
4834 		  if (loc)
4835 		    bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4836 		}
4837 	      else
4838 		bfd_put_32 (output_bfd, 1,
4839 			    htab->elf.sgot->contents + off);
4840 	      htab->tls_ldm_got.offset |= 1;
4841 	    }
4842 	  relocation
4843 	    = (htab->elf.sgot->output_section->vma
4844 	       + htab->elf.sgot->output_offset + off
4845 	       - (input_section->output_section->vma
4846 		  + input_section->output_offset + rel->r_offset));
4847 	  break;
4848 	case R_CKCORE_TLS_LE32:
4849 	  if (bfd_link_dll (info))
4850 	    {
4851 	      _bfd_error_handler
4852 		/* xgettext:c-format */
4853 		(_("%pB(%pA+%#" PRIx64 "): %s relocation not permitted "
4854 		   "in shared object"),
4855 		 input_bfd, input_section, (uint64_t)rel->r_offset,
4856 		 howto->name);
4857 	      return FALSE;
4858 	    }
4859 	  else
4860 	    relocation = tpoff (info, relocation);
4861 	  break;
4862 	case R_CKCORE_TLS_GD32:
4863 	case R_CKCORE_TLS_IE32:
4864 	  {
4865 	    int indx;
4866 	    char tls_type;
4867 
4868 	    BFD_ASSERT (htab->elf.sgot != NULL);
4869 
4870 	    indx = 0;
4871 	    if (h != NULL)
4872 	      {
4873 		bfd_boolean dyn;
4874 		dyn = htab->elf.dynamic_sections_created;
4875 		if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4876 						     bfd_link_pic (info), h)
4877 		    && (!bfd_link_pic (info)
4878 			|| !SYMBOL_REFERENCES_LOCAL (info, h)))
4879 		  {
4880 		    unresolved_reloc = FALSE;
4881 		    indx = h->dynindx;
4882 		  }
4883 		off = h->got.offset;
4884 		tls_type = ((struct csky_elf_link_hash_entry *)h)->tls_type;
4885 	      }
4886 	    else
4887 	      {
4888 		BFD_ASSERT (local_got_offsets != NULL);
4889 		off = local_got_offsets[r_symndx];
4890 		tls_type = csky_elf_local_got_tls_type (input_bfd)[r_symndx];
4891 	      }
4892 
4893 	    BFD_ASSERT (tls_type != GOT_UNKNOWN);
4894 
4895 	    if (off & 1)
4896 	      off &= ~1;
4897 	    else
4898 	      {
4899 		bfd_boolean need_relocs = FALSE;
4900 		Elf_Internal_Rela outrel;
4901 		bfd_byte *loc = NULL;
4902 		int cur_off = off;
4903 		/* The GOT entries have not been initialized yet.  Do it
4904 		   now, and emit any relocations.  If both an IE GOT and a
4905 		   GD GOT are necessary, we emit the GD first.  */
4906 		if ((!bfd_link_executable (info) || indx != 0)
4907 		    && (h == NULL
4908 			|| (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4909 			    && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
4910 			|| h->root.type != bfd_link_hash_undefined))
4911 		  {
4912 		    need_relocs = TRUE;
4913 		    BFD_ASSERT (htab->elf.srelgot != NULL);
4914 
4915 		    loc = htab->elf.srelgot->contents;
4916 		    loc += (htab->elf.srelgot->reloc_count
4917 			    * sizeof (Elf32_External_Rela));
4918 		  }
4919 		if (tls_type & GOT_TLS_GD)
4920 		  {
4921 		    if (need_relocs)
4922 		      {
4923 			outrel.r_addend = 0;
4924 			outrel.r_offset
4925 			  = (htab->elf.sgot->output_section->vma
4926 			     + htab->elf.sgot->output_offset
4927 			     + cur_off);
4928 			outrel.r_info
4929 			  = ELF32_R_INFO (indx, R_CKCORE_TLS_DTPMOD32);
4930 			bfd_put_32 (output_bfd, outrel.r_addend,
4931 				    htab->elf.sgot->contents + cur_off);
4932 			if (loc)
4933 			  bfd_elf32_swap_reloca_out (output_bfd,
4934 						     &outrel, loc);
4935 			loc += sizeof (Elf32_External_Rela);
4936 			htab->elf.srelgot->reloc_count++;
4937 			if (indx == 0)
4938 			  bfd_put_32 (output_bfd,
4939 				      relocation - dtpoff_base (info),
4940 				      (htab->elf.sgot->contents
4941 				       + cur_off + 4));
4942 			else
4943 			  {
4944 			    outrel.r_addend = 0;
4945 			    outrel.r_info
4946 			      = ELF32_R_INFO (indx, R_CKCORE_TLS_DTPOFF32);
4947 			    outrel.r_offset += 4;
4948 			    bfd_put_32 (output_bfd, outrel.r_addend,
4949 					(htab->elf.sgot->contents
4950 					 + cur_off + 4));
4951 			    outrel.r_info =
4952 			      ELF32_R_INFO (indx,
4953 					    R_CKCORE_TLS_DTPOFF32);
4954 			    if (loc)
4955 			      bfd_elf32_swap_reloca_out (output_bfd,
4956 							 &outrel,
4957 							 loc);
4958 			    htab->elf.srelgot->reloc_count++;
4959 			    loc += sizeof (Elf32_External_Rela);
4960 			  }
4961 
4962 		      }
4963 		    else
4964 		      {
4965 			/* If are not emitting relocations for a
4966 			   general dynamic reference, then we must be in a
4967 			   static link or an executable link with the
4968 			   symbol binding locally.  Mark it as belonging
4969 			   to module 1, the executable.  */
4970 			bfd_put_32 (output_bfd, 1,
4971 				    htab->elf.sgot->contents + cur_off);
4972 			bfd_put_32 (output_bfd,
4973 				    relocation - dtpoff_base (info),
4974 				    htab->elf.sgot->contents
4975 				    + cur_off + 4);
4976 		      }
4977 		    cur_off += 8;
4978 		  }
4979 		if (tls_type & GOT_TLS_IE)
4980 		  {
4981 		    if (need_relocs)
4982 		      {
4983 			if (indx == 0)
4984 			  outrel.r_addend = relocation - dtpoff_base (info);
4985 			else
4986 			  outrel.r_addend = 0;
4987 			outrel.r_offset
4988 			  = (htab->elf.sgot->output_section->vma
4989 			     + htab->elf.sgot->output_offset + cur_off);
4990 			outrel.r_info
4991 			  = ELF32_R_INFO (indx, R_CKCORE_TLS_TPOFF32);
4992 
4993 			bfd_put_32 (output_bfd, outrel.r_addend,
4994 				    htab->elf.sgot->contents + cur_off);
4995 			if (loc)
4996 			  bfd_elf32_swap_reloca_out (output_bfd,
4997 						     &outrel, loc);
4998 			htab->elf.srelgot->reloc_count++;
4999 			loc += sizeof (Elf32_External_Rela);
5000 		      }
5001 		    else
5002 		      bfd_put_32 (output_bfd, tpoff (info, relocation),
5003 				  htab->elf.sgot->contents + cur_off);
5004 		  }
5005 		if (h != NULL)
5006 		  h->got.offset |= 1;
5007 		else
5008 		  local_got_offsets[r_symndx] |= 1;
5009 	      }
5010 	    if ((tls_type & GOT_TLS_GD) && howto->type != R_CKCORE_TLS_GD32)
5011 	      off += 8;
5012 	    relocation
5013 	      = (htab->elf.sgot->output_section->vma
5014 		 + htab->elf.sgot->output_offset + off
5015 		 - (input_section->output_section->vma
5016 		    + input_section->output_offset
5017 		    + rel->r_offset));
5018 	    break;
5019 	  }
5020 	default:
5021 	  /* No substitution when final linking.  */
5022 	  read_content_substitute = 0;
5023 	  break;
5024 	} /* End switch (howto->type).  */
5025 
5026       /* Make sure 32-bit data in the text section will not be affected by
5027 	 our special endianness.
5028 	 However, this currently affects noting, since the ADDR32 howto type
5029 	 does no change with the data read. But we may need this mechanism in
5030 	 the future.  */
5031 
5032       if (howto->size == 2
5033 	  && (howto->type == R_CKCORE_ADDR32
5034 	      || howto->type == R_CKCORE_PCREL32
5035 	      || howto->type == R_CKCORE_GOT32
5036 	      || howto->type == R_CKCORE_GOTOFF
5037 	      || howto->type == R_CKCORE_GOTPC
5038 	      || howto->type == R_CKCORE_PLT32
5039 	      || howto->type == R_CKCORE_TLS_LE32
5040 	      || howto->type == R_CKCORE_TLS_IE32
5041 	      || howto->type == R_CKCORE_TLS_LDM32
5042 	      || howto->type == R_CKCORE_TLS_GD32
5043 	      || howto->type == R_CKCORE_TLS_LDO32
5044 	      || howto->type == R_CKCORE_RELATIVE))
5045 	need_reverse_bits = 0;
5046       else
5047 	need_reverse_bits = 1;
5048       /* Do the final link.  */
5049       if (howto->type != R_CKCORE_PCREL_JSR_IMM11BY2
5050 	  && howto->type != R_CKCORE_PCREL_JSR_IMM26BY2
5051 	  && howto->type != R_CKCORE_CALLGRAPH
5052 	  && do_final_relocate)
5053 	r = csky_final_link_relocate (howto, input_bfd, input_section,
5054 				      contents, rel->r_offset,
5055 				      relocation, addend);
5056 
5057       if (r != bfd_reloc_ok)
5058 	{
5059 	  ret = FALSE;
5060 	  switch (r)
5061 	    {
5062 	    default:
5063 	      break;
5064 	    case bfd_reloc_overflow:
5065 	      if (h != NULL)
5066 		name = NULL;
5067 	      else
5068 		{
5069 		  name = bfd_elf_string_from_elf_section (input_bfd,
5070 							  symtab_hdr->sh_link,
5071 							  sym->st_name);
5072 		  if (name == NULL)
5073 		    break;
5074 		  if (*name == '\0')
5075 		    name = bfd_section_name (input_bfd, sec);
5076 		}
5077 	      (*info->callbacks->reloc_overflow)
5078 		(info,
5079 		 (h ? &h->root : NULL),
5080 		 name, howto->name, (bfd_vma) 0,
5081 		 input_bfd, input_section, rel->r_offset);
5082 	      break;
5083 	    }
5084 	}
5085     } /* End for (;rel < relend; rel++).  */
5086   return ret;
5087 }
5088 
5089 static bfd_boolean
5090 csky_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
5091 {
5092   int offset;
5093   size_t size;
5094 
5095   switch (note->descsz)
5096     {
5097     default:
5098       return FALSE;
5099       /* Sizeof (struct elf_prstatus) on C-SKY V1 arch.  */
5100     case 148:
5101       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
5102       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
5103       offset = 72;
5104       size = 72;
5105       break;
5106       /* Sizeof (struct elf_prstatus) on C-SKY V1 arch.  */
5107     case 220:
5108       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
5109       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
5110       offset = 72;
5111       size = 34 * 4;
5112       break;
5113     }
5114   /* Make a ".reg/999" section.  */
5115   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
5116 					  size, note->descpos + offset);
5117 }
5118 
5119 static bfd_boolean
5120 csky_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
5121 {
5122   switch (note->descsz)
5123     {
5124     default:
5125       return FALSE;
5126 
5127       /* Sizeof (struct elf_prpsinfo) on linux csky.  */
5128     case 124:
5129       elf_tdata (abfd)->core->program
5130 	= _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
5131       elf_tdata (abfd)->core->command
5132 	= _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
5133     }
5134 
5135   /* Note that for some reason, a spurious space is tacked
5136      onto the end of the args in some (at least one anyway)
5137      implementations, so strip it off if it exists.  */
5138   {
5139     char *command = elf_tdata (abfd)->core->command;
5140     int n = strlen (command);
5141 
5142     if (0 < n && command[n - 1] == ' ')
5143       command[n - 1] = '\0';
5144   }
5145 
5146   return TRUE;
5147 }
5148 
5149 /* End of external entry points for sizing and building linker stubs.  */
5150 
5151 /* CPU-related basic API.  */
5152 #define TARGET_BIG_SYM                        csky_elf32_be_vec
5153 #define TARGET_BIG_NAME                       "elf32-csky-big"
5154 #define TARGET_LITTLE_SYM                     csky_elf32_le_vec
5155 #define TARGET_LITTLE_NAME                    "elf32-csky-little"
5156 #define ELF_ARCH                              bfd_arch_csky
5157 #define ELF_MACHINE_CODE                      EM_CSKY
5158 #define ELF_MACHINE_ALT1		      EM_CSKY_OLD
5159 #define ELF_MAXPAGESIZE                       0x1000
5160 #define elf_info_to_howto                     csky_elf_info_to_howto
5161 #define elf_info_to_howto_rel                 NULL
5162 #define elf_backend_special_sections          csky_elf_special_sections
5163 #define bfd_elf32_bfd_link_hash_table_create  csky_elf_link_hash_table_create
5164 
5165 /* Target related API.  */
5166 #define bfd_elf32_mkobject                    csky_elf_mkobject
5167 #define bfd_elf32_bfd_merge_private_bfd_data  csky_elf_merge_private_bfd_data
5168 #define bfd_elf32_bfd_set_private_flags       csky_elf_set_private_flags
5169 #define elf_backend_copy_indirect_symbol      csky_elf_copy_indirect_symbol
5170 
5171 /* GC section related API.  */
5172 #define elf_backend_can_gc_sections           1
5173 #define elf_backend_gc_mark_hook              csky_elf_gc_mark_hook
5174 #define elf_backend_gc_mark_extra_sections    elf32_csky_gc_mark_extra_sections
5175 
5176 /* Relocation related API.  */
5177 #define elf_backend_reloc_type_class          csky_elf_reloc_type_class
5178 #define bfd_elf32_bfd_reloc_type_lookup       csky_elf_reloc_type_lookup
5179 #define bfd_elf32_bfd_reloc_name_lookup       csky_elf_reloc_name_lookup
5180 #define elf_backend_ignore_discarded_relocs   csky_elf_ignore_discarded_relocs
5181 #define elf_backend_relocate_section          csky_elf_relocate_section
5182 #define elf_backend_check_relocs              csky_elf_check_relocs
5183 
5184 /* Dynamic relocate related API.  */
5185 #define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
5186 #define elf_backend_adjust_dynamic_symbol     csky_elf_adjust_dynamic_symbol
5187 #define elf_backend_size_dynamic_sections     csky_elf_size_dynamic_sections
5188 #define elf_backend_finish_dynamic_symbol     csky_elf_finish_dynamic_symbol
5189 #define elf_backend_finish_dynamic_sections   csky_elf_finish_dynamic_sections
5190 #define elf_backend_rela_normal               1
5191 #define elf_backend_can_refcount              1
5192 #define elf_backend_plt_readonly              1
5193 #define elf_backend_want_got_sym              1
5194 #define elf_backend_want_dynrelro             1
5195 #define elf_backend_got_header_size           12
5196 #define elf_backend_want_got_plt              1
5197 
5198 /* C-SKY coredump support.  */
5199 #define elf_backend_grok_prstatus             csky_elf_grok_prstatus
5200 #define elf_backend_grok_psinfo               csky_elf_grok_psinfo
5201 
5202 #include "elf32-target.h"
5203