Bug 15389 - [avr] section '.note.gnu.build-id' allocated at address zero
Summary: [avr] section '.note.gnu.build-id' allocated at address zero
Status: RESOLVED FIXED
Alias: None
Product: binutils
Classification: Unclassified
Component: ld (show other bugs)
Version: 2.23
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-04-23 06:25 UTC by Justin Gottula
Modified: 2013-04-24 15:30 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Justin Gottula 2013-04-23 06:25:20 UTC
If gcc is configured with --enable-linker-build-id (as became the case for Arch Linux's avr-gcc package recently when it was bumped to 4.8.0), then it passes --build-id to the linker, and a '.note.gnu.build-id' section is allocated in avr executables at address zero (where the interrupt vector table should be).

(See http://gcc.gnu.org/ml/gcc-patches/2010-10/msg00332.html for more on this, in the context of making --enable-linker-build-id the default behavior, which apparently didn't happen.)

Strictly speaking, this is a configuration problem, so I will report it to my distribution's package maintainers. However, I suggest that the linker scripts should explicitly shove this section into a black hole, or at least handle it similarly to the '.comment' or debug information sections (i.e., don't allocate any memory for it). Peeking into the avr linker scripts, there doesn't seem to be any any particular handling for it right now. ld's default behavior is apparently just to drop sections it doesn't know about at address zero; and then to dutifully shift the .text section (including the vector table, of course) and all of the jump addresses over by 36 bytes so you can't just strip out the problem section.


Steps to reproduce:
1. configure avr-gcc with --enable-linker-build-id
2. compile and link pretty much any avr program
3. run 'avr-objdump -h' or 'readelf -S'
(You could also use -Wl,--build-id when linking, but that would just be idiotic.)



broken.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .note.gnu.build-id 00000024  00000000  00000000  00000094  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .data         00000000  00800100  000000ca  0000015e  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .text         000000a6  00000024  00000024  000000b8  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .stab         00000738  00000000  00000000  00000160  2**2
                  CONTENTS, READONLY, DEBUGGING
  4 .stabstr      000000a1  00000000  00000000  00000898  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .comment      00000011  00000000  00000000  00000939  2**0
                  CONTENTS, READONLY

Disassembly of section .note.gnu.build-id:

00000000 <.note.gnu.build-id>:
   0:   04 00           .word   0x0004  ; ????
   2:   00 00           nop
   4:   14 00           .word   0x0014  ; ????
   6:   00 00           nop
   8:   03 00           .word   0x0003  ; ????
   a:   00 00           nop
   c:   47 4e           sbci    r20, 0xE7       ; 231
   e:   55 00           .word   0x0055  ; ????
  10:   c5 c7           rjmp    .+3978          ; 0xf9c <__stack+0x69d>
  12:   03 77           andi    r16, 0x73       ; 115
  14:   fc 8d           ldd     r31, Y+28       ; 0x1c
  16:   c6 07           cpc     r28, r22
  18:   7f d8           rcall   .-3842          ; 0xfffff118 <__eeprom_end+0xff7ef118>
  1a:   61 e8           ldi     r22, 0x81       ; 129
  1c:   68 32           cpi     r22, 0x28       ; 40
  1e:   49 38           cpi     r20, 0x89       ; 137
  20:   c5 69           ori     r28, 0x95       ; 149
  22:   c4 85           ldd     r28, Z+12       ; 0x0c

Disassembly of section .text:

00000024 <__vectors>:
  24:   0c 94 50 00     jmp     0xa0    ; 0xa0 <__ctors_end>
  28:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  2c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  30:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  34:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  38:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  3c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  40:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  44:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  48:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  4c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  50:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  54:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  58:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  5c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  60:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  64:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  68:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  6c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  70:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  74:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  78:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  7c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  80:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  84:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  88:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  8c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  90:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  94:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  98:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
  9c:   0c 94 5a 00     jmp     0xb4    ; 0xb4 <__bad_interrupt>
Comment 1 cvs-commit@gcc.gnu.org 2013-04-24 15:28:13 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	nickc@sourceware.org	2013-04-24 15:28:12

Modified files:
	ld             : ChangeLog 
	ld/scripttempl : avr.sc 

Log message:
	PR ld/15389
	* scripttempl/avr.sc: Add .note.gnu.build-id section.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/ChangeLog.diff?cvsroot=src&r1=1.2579&r2=1.2580
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/scripttempl/avr.sc.diff?cvsroot=src&r1=1.17&r2=1.18
Comment 2 Nick Clifton 2013-04-24 15:30:11 UTC
Hi Justin,

  Thanks for the bug report.  I have updated the built-in linker script for the AVR linker to add an explicit .note.gnu.build-id section which then ensures that this section does not interfere with the placement of the .text section.

Cheers
  Nick