Blame view

buildroot/buildroot-2016.08.1/package/binutils/2.24/911-xtensa-fix-localized-symbol-refcounting-with-gc-sect.patch 1.89 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  From 8ec76b16f62d1bf386fb2c39af5f66c3afddc5cb Mon Sep 17 00:00:00 2001
  From: Max Filippov <jcmvbkbc@gmail.com>
  Date: Thu, 14 May 2015 05:22:55 +0300
  Subject: [PATCH] xtensa: fix localized symbol refcounting with --gc-sections
  
  elf_xtensa_gc_sweep_hook doesn't correctly unreference symbols that were
  made local, that results in link failure with the following message:
  
    BFD (GNU Binutils) 2.24 internal error, aborting at elf32-xtensa.c line
    3372 in elf_xtensa_finish_dynamic_sections
  
  elf_xtensa_gc_sweep_hook determines symbol reference type (PLT or GOT) by
  relocation type. Relocation types are not changed when symbol becomes
  local, but its PLT references are added to GOT references and
  plt.refcount is set to 0. Such symbol cannot be unreferences in the
  elf_xtensa_gc_sweep_hook and its extra references make calculated GOT
  relocations section size not match number of GOT relocations.
  
  Fix it by treating PLT reference as GOT reference when plt.refcount is
  not positive.
  
  2015-05-14  Max Filippov  <jcmvbkbc@gmail.com>
  bfd/
  	* elf32-xtensa.c (elf_xtensa_gc_sweep_hook): Treat PLT reference
  	as GOT reference when plt.refcount is not positive.
  
  Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
  ---
  Backported from: e6c9a083ec5ae7a45bd71682b26aae1939849388
  Changes to ChangeLog are dropped.
  
   bfd/elf32-xtensa.c | 6 +++++-
   1 file changed, 5 insertions(+), 1 deletion(-)
  
  diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
  index 53af1c6..2523670 100644
  --- a/bfd/elf32-xtensa.c
  +++ b/bfd/elf32-xtensa.c
  @@ -1360,10 +1360,14 @@ elf_xtensa_gc_sweep_hook (bfd *abfd,
   	{
   	  if (is_plt)
   	    {
  +	      /* If the symbol has been localized its plt.refcount got moved
  +	         to got.refcount.  Handle it as GOT.  */
   	      if (h->plt.refcount > 0)
   		h->plt.refcount--;
  +	      else
  +		is_got = TRUE;
   	    }
  -	  else if (is_got)
  +	  if (is_got)
   	    {
   	      if (h->got.refcount > 0)
   		h->got.refcount--;
  -- 
  1.8.1.4