bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ihex output from ld (2.13)erroneous?


From: Peter Janhall
Subject: Re: ihex output from ld (2.13)erroneous?
Date: Thu, 17 Apr 2003 01:10:21 +0200

Hello Cliff, thank you for your interest.

Here are my files:

tmain.hex is the good one 
tmain-bad.hex is the bad one
iom128.h defines PORTB and DDRB
Makefile shows my command line
linker.cmd i my link control file

I use avr-libc-20020203 with ATMega128 support enabled.

Unfortunately I have no tool for dissambling ihex-files, and I have
not dissambled them by hand, so I can't tell the difference between
better than 'diff' can.

Don't hesitate to ask me to perform any experiments regarding this matter.

/speja


Nick Clifton wrote:
> 
> Hi Peter,
> 
> > There seems to be a problem when making ld produce ihex output files.
> 
> Thank you for bringing this to our attention.  Unfortunately you have
> not really given us enough information to study this problem.  For
> example - what is the command line you used to link and create the
> ihex file in one operation ?  What are the values for DDRB and PORTB
> in your example program ?  How do the working and non-working ihex
> files differ ?
> 
> I suspect that the problem will be improperly resolved relocs.  For
> example when I tried to use the test program you supplied I found that
> the value for the first instruction in the program was different when
> the ihex file was created directly from the linker and from when it
> was linked as an ELF file and the objcopy'ed into an ihex file.
> 
> The direct from linker version had 0x1F 0xE3 as the first instruction,
> whereas the converted ELF file had 0xCF 0xE5.  Looking at the
> disassembly of the object file, it seems that this first instruction
> is:
> 
>   0:   c0 e0           ldi     r28, 0x00       ; 0
>                         0: R_AVR_LO8_LDI        __stack
> 
> So this implies that the R_AVR_LO8_LDI reloc has not been processed
> correctly when creating an ihex output file.  Looking at the code in
> elf32-avr.c it seems that none of the relocs in the
> elf_avr_howto_table[] are correctly set up.  (They do not check for
> overflow, their bitmasks are wrong, etc).
> 
> Maybe Denis or Marek, the AVR maintainers, can look into this ?
> 
> Cheers
>         Nick
> 
> PS.  Denis/Marek - Peter's original email is here:
> 
>    http://sources.redhat.com/ml/bug-binutils/2003-q2/msg00073.html
/*
   iom128.h - AVR ATmega128 defines
   
   Contributors:
    Created by Peter Jansen <address@hidden> 

   THIS SOFTWARE IS NOT COPYRIGHTED

   This source code is offered for use in the public domain.  You may
   use, modify or distribute it freely.

   This code is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY.  ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
   DISCLAIMED.  This includes but is not limited to warranties of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

*/

#ifndef __IOM128
#define __IOM128 1

#define AVR_MEGA 1
#define AVR_ENHANCED 1

/*
 * Predefined SFR Addresses.
 * NOTE: These addresses will be either DATA MEMORY or I/O MEMORY addresses,
 * depending on how you define __SFR_OFFSET (0x0 for I/O, 0x20 for DATA).
 * For accesses to memory locations 0x20 through to 0x5F, gcc subtracts
 * 0x20 from the address supplied and uses an I/O instruction, rather than
 * a data memory access instruction (I/O instructions can only address the
 * first 64 I/O memory locations).
 * By using the __SFR_OFFSET symbol defined as 0x20 in the header file, all
 * special file registers (data memory addresses 0x00--0x1F), all I/O
 * registers (data memory address 0x20--0x5F, I/O memory address 0x00--0x3F)
 * and all extended I/O registers (data memory address 0x60--0xFF) can be
 * used as is, without being wrapped in macros to adjust the address.
 */
/* #define __SFR_OFFSET 0x0 */
#define __SFR_OFFSET 0x20

/* Input Pins, Port F */
#define PINF      (0x0 + __SFR_OFFSET)

/* Input Pins, Port E */
#define PINE      (0x1 + __SFR_OFFSET)

/* Data Direction Register, Port E */
#define DDRE      (0x2 + __SFR_OFFSET)

/* Data Register, Port E */
#define PORTE     (0x3 + __SFR_OFFSET)

/* ADC Low Byte */
#define ADCL      (0x4 + __SFR_OFFSET)

/* ADC High Byte */
#define ADCH      (0x5 + __SFR_OFFSET)

/* ADC Control and status register */
#define ADCSR     (0x6 + __SFR_OFFSET)

/* ADC Multiplexer select */
#define ADMUX     (0x7 + __SFR_OFFSET)

/* Analog Comparator Control and Status Register */
#define ACSR      (0x8 + __SFR_OFFSET)

/* USART0 Baud Rate Register Low */
#define UBRR0L    (0x9 + __SFR_OFFSET)

/* USART0 Control and Status Register B */
#define UCSR0B    (0xA + __SFR_OFFSET)

/* USART0 Control and Status Register A */
#define UCSR0A    (0xB + __SFR_OFFSET)

/* USART I/O Data Register */
#define UDR0      (0xC + __SFR_OFFSET)

/* SPI Control Register */
#define SPCR      (0xD + __SFR_OFFSET)

/* SPI Status Register */
#define SPSR      (0xE + __SFR_OFFSET)

/* SPI I/O Data Register */
#define SPDR      (0xF + __SFR_OFFSET)

/* Input Pins, Port D */
#define PIND      (0x10 + __SFR_OFFSET)

/* Data Direction Register, Port D */
#define DDRD      (0x11 + __SFR_OFFSET)

/* Data Register, Port D */
#define PORTD     (0x12 + __SFR_OFFSET)

/* Input Pins, Port C */
#define PINC      (0x13 + __SFR_OFFSET)

/* Data Direction Register, Port C */
#define DDRC      (0x14 + __SFR_OFFSET)

/* Data Register, Port C */
#define PORTC     (0x15 + __SFR_OFFSET)

/* Input Pins, Port B */
#define PINB      (0x16 + __SFR_OFFSET)

/* Data Direction Register, Port B */
#define DDRB      (0x17 + __SFR_OFFSET)

/* Data Register, Port B */
#define PORTB     (0x18 + __SFR_OFFSET)

/* Input Pins, Port A */
#define PINA      (0x19 + __SFR_OFFSET)

/* Data Direction Register, Port A */
#define DDRA      (0x1A + __SFR_OFFSET)

/* Data Register, Port A */
#define PORTA     (0x1B + __SFR_OFFSET)

/* EEPROM Control Register */
#define EECR      (0x1C + __SFR_OFFSET)

/* EEPROM Data Register */
#define EEDR      (0x1D + __SFR_OFFSET)

/* EEPROM Address Register Low */
#define EEARL     (0x1E + __SFR_OFFSET)

/* EEPROM Address Register High */
#define EEARH     (0x1F + __SFR_OFFSET)

/* Special Function I/O Register */
#define SFIOR     (0x20 + __SFR_OFFSET)

/* Watchdog Timer Control Register */
#define WDTCR     (0x21 + __SFR_OFFSET)

/* On-chip Debug Register */
#define OCDR      (0x22 + __SFR_OFFSET)

/* Timer2 Output Compare Register */
#define OCR2      (0x23 + __SFR_OFFSET)

/* Timer/Counter 2 */
#define TCNT2     (0x24 + __SFR_OFFSET)

/* Timer/Counter 2 Control register */
#define TCCR2     (0x25 + __SFR_OFFSET)

/* T/C 1 Input Capture Register Low */
#define ICR1L     (0x26 + __SFR_OFFSET)

/* T/C 1 Input Capture Register High */
#define ICR1H     (0x27 + __SFR_OFFSET)

/* Timer/Counter1 Output Compare Register B Low */
#define OCR1BL    (0x28 + __SFR_OFFSET)

/* Timer/Counter1 Output Compare Register B High */
#define OCR1BH    (0x29 + __SFR_OFFSET)

/* Timer/Counter1 Output Compare Register A Low */
#define OCR1AL    (0x2A + __SFR_OFFSET)

/* Timer/Counter1 Output Compare Register A High */
#define OCR1AH    (0x2B + __SFR_OFFSET)

/* Timer/Counter 1 Low */
#define TCNT1L    (0x2C + __SFR_OFFSET)

/* Timer/Counter 1 High */
#define TCNT1H    (0x2D + __SFR_OFFSET)

/* Timer/Counter 1 Control and Status Register */
#define TCCR1B    (0x2E + __SFR_OFFSET)

/* Timer/Counter 1 Control Register */
#define TCCR1A    (0x2F + __SFR_OFFSET)

/* Timer/Counter 0 Asynchronous Control & Status Register */
#define ASSR      (0x30 + __SFR_OFFSET)

/* Output Compare Register 0 */
#define OCR0      (0x31 + __SFR_OFFSET)

/* Timer/Counter 0 */
#define TCNT0     (0x32 + __SFR_OFFSET)

/* Timer/Counter 0 Control Register */
#define TCCR0     (0x33 + __SFR_OFFSET)

/* MCU Status Register */
#define MCUSR     (0x34 + __SFR_OFFSET)

/* MCU general Control Register */
#define MCUCR     (0x35 + __SFR_OFFSET)

/* Timer/Counter Interrupt Flag Register */
#define TIFR      (0x36 + __SFR_OFFSET)

/* Timer/Counter Interrupt MaSK register */
#define TIMSK     (0x37 + __SFR_OFFSET)

/* External Interrupt Flag Register */
#define EIFR      (0x38 + __SFR_OFFSET)

/* External Interrupt MaSK register */
#define EIMSK     (0x39 + __SFR_OFFSET)

/* External Interrupt Control Register B */
#define EICRB     (0x3A + __SFR_OFFSET)

/* RAM Page Z select register */
#define RAMPZ     (0x3B + __SFR_OFFSET)

/* XDIV Divide control register */
#define XDIV      (0x3C + __SFR_OFFSET)

/* Stack Pointer Low */
#define SPL       (0x3D + __SFR_OFFSET)

/* Stack Pointer High */
#define SPH       (0x3E + __SFR_OFFSET)

/* Status REGister */
#define SREG      (0x3F + __SFR_OFFSET)

/* Data Direction Register, Port F */
#define DDRF      (0x61)

/* Data Register, Port F */
#define PORTF     (0x62)

/* Input Pins, Port G */
#define PING      (0x63)

/* Data Direction Register, Port G */
#define DDRG      (0x64)

/* Data Register, Port G */
#define PORTG     (0x65)

/* Store Program Memory Control Register */
#define SPMCR     (0x68)

/* External Interrupt Control Register A */
#define EICRA     (0x6A)

/* External Memory Control Register B */
#define XMCRB     (0x6C)

/* External Memory Control Register A */
#define XMCRA     (0x6D)

/* Oscillator Calibration Register */
#define OSCCAL    (0x6F)

/* 2-wire Serial Interface Bit Rate Register */
#define TWBR      (0x70)

/* 2-wire Serial Interface Status Register */
#define TWSR      (0x71)

/* 2-wire Serial Interface Address Register */
#define TWAR      (0x72)

/* 2-wire Serial Interface Data Register */
#define TWDR      (0x73)

/* 2-wire Serial Interface Control Register */
#define TWCR      (0x74)

/* Time Counter 1 Output Compare Register C Low */
#define OCR1CL    (0x78)

/* Time Counter 1 Output Compare Register C High */
#define OCR1CH    (0x79)

/* Timer/Counter 1 Control Register C */
#define TCCR1C    (0x7A)

/* Extended Timer Interrupt Flag Register */
#define ETIFR     (0x7C)

/* Extended Timer Interrupt Mask Register */
#define ETIMSK    (0x7D)

/* Timer/Counter 3 Input Capture Register Low */
#define ICR3L     (0x80)

/* Timer/Counter 3 Input Capture Register High */
#define ICR3H     (0x81)

/* Timer/Counter 3 Output Compare Register C Low */
#define OCR3CL    (0x82)

/* Timer/Counter 3 Output Compare Register C High */
#define OCR3CH    (0x83)

/* Timer/Counter 3 Output Compare Register B Low */
#define OCR3BL    (0x84)

/* Timer/Counter 3 Output Compare Register B High */
#define OCR3BH    (0x85)

/* Timer/Counter 3 Output Compare Register A Low */
#define OCR3AL    (0x86)

/* Timer/Counter 3 Output Compare Register A High */
#define OCR3AH    (0x87)

/* Timer/Counter 3 Counter Register High */
#define TCNT3L    (0x88)

/* Timer/Counter 3 Counter Register High */
#define TCNT3H    (0x89)

/* Timer/Counter 3 Control Register B */
#define TCCR3B    (0x8A)

/* Timer/Counter 3 Control Register A */
#define TCCR3A    (0x8B)

/* Timer/Counter 3 Control Register C */
#define TCCR3C    (0x8C)

/* USART0 Baud Rate Register High */
#define UBRR0H    (0x90)

/* USART0 Control and Status Register C */
#define UCSR0C    (0x95)

/* USART1 Baud Rate Register High */
#define UBRR1H    (0x98)

/* USART1 Baud Rate Register Low*/
#define UBRR1L    (0x99)

/* USART1 Control and Status Register B */
#define UCSR1B    (0x9A)

/* USART1 Control and Status Register A */
#define UCSR1A    (0x9B)

/* USART1 I/O Data Register */
#define UDR1      (0x9C)

/* USART1 Control and Status Register C */
#define UCSR1C    (0x9D)

/*
  * Interrupt Vector Definitions
  */

#define SIG_INTERRUPT0          _vector_1
#define SIG_INTERRUPT1          _vector_2
#define SIG_INTERRUPT2          _vector_3
#define SIG_INTERRUPT3          _vector_4
#define SIG_INTERRUPT4          _vector_5
#define SIG_INTERRUPT5          _vector_6
#define SIG_INTERRUPT6          _vector_7
#define SIG_INTERRUPT7          _vector_8
#define SIG_OUTPUT_COMPARE2     _vector_9
#define SIG_OVERFLOW2           _vector_10
#define SIG_INPUT_CAPTURE1      _vector_11
#define SIG_OUTPUT_COMPARE1A    _vector_12
#define SIG_OUTPUT_COMPARE1B    _vector_13
#define SIG_OVERFLOW1           _vector_14
#define SIG_OUTPUT_COMPARE0     _vector_15
#define SIG_OVERFLOW0           _vector_16
#define SIG_SPI                 _vector_17
#define SIG_UART0_RECV          _vector_18
#define SIG_UART0_DATA          _vector_19
#define SIG_UART0_TRANS         _vector_20
#define SIG_ADC                 _vector_21
#define SIG_EEPROM_READY        _vector_22
#define SIG_COMPARATOR          _vector_23
#define SIG_OUTPUT_COMPARE1C    _vector_24
#define SIG_INPUT_CAPTURE3      _vector_25
#define SIG_OUTPUT_COMPARE3A    _vector_26
#define SIG_OUTPUT_COMPARE3B    _vector_27
#define SIG_OUTPUT_COMPARE3C    _vector_28
#define SIG_OVERFLOW3           _vector_29
#define SIG_UART1_RECV          _vector_30
#define SIG_UART1_DATA          _vector_31
#define SIG_UART1_TRANS         _vector_32
#define SIG_2WIRE_SERIAL        _vector_33
#define SIG_SPM_READY           _vector_34

#define END_VECTOR              (34)
#define INT_VECT_SIZE (0x8c)

/*
   The Register Bit names are represented by their bit number (0-7).
*/

/* 2-wire Control Register */
#define    TWINT        7
#define    TWEA         6
#define    TWSTA        5
#define    TWSTO        4
#define    TWWC         3
#define    TWEN         2
#define    TWIE         0

/* 2-wire Address Register */
#define    TWA6         7
#define    TWA5         6
#define    TWA4         5
#define    TWA3         4
#define    TWA2         3
#define    TWA1         2
#define    TWA0         1
#define    TWGCE        0

/* 2-wire Status Register */
#define    TWS7         7
#define    TWS6         6
#define    TWS5         5
#define    TWS4         4
#define    TWS3         3
#define    TWPS1        1
#define    TWPS0        0

/* External Memory Control Register A */
#define    SRL2         6
#define    SRL1         5
#define    SRL0         4
#define    SRW01        3
#define    SRW00        2
#define    SRW11        1

/* External Memory Control Register B */
#define    XMBK         7
#define    XMM2         2
#define    XMM1         1
#define    XMM0         0

/* XDIV Divide control register*/
#define    XDIVEN       7
#define    XDIV6        6
#define    XDIV5        5
#define    XDIV4        4
#define    XDIV3        3
#define    XDIV2        2
#define    XDIV1        1
#define    XDIV0        0

/* RAM Page Z select register */
#define     RAMPZ0      0

/* External Interrupt Control Register A */
#define    ISC31        7
#define    ISC30        6
#define    ISC21        5
#define    ISC20        4
#define    ISC11        3
#define    ISC10        2
#define    ISC01        1
#define    ISC00        0

/* External Interrupt Control Register B */
#define    ISC71        7
#define    ISC70        6
#define    ISC61        5
#define    ISC60        4
#define    ISC51        3
#define    ISC50        2
#define    ISC41        1
#define    ISC40        0

/* Store Program Memory Control Register */
#define    SPMIE        7
#define    RWWSB        6
#define    RWWSRE       4
#define    BLBSET       3
#define    PGWRT        2
#define    PGERS        1
#define    SPMEN        0

/* External Interrupt MaSK register */
#define    INT7         7
#define    INT6         6
#define    INT5         5
#define    INT4         4
#define    INT3         3
#define    INT2         2
#define    INT1         1
#define    INT0         0

/* External Interrupt Flag Register */
#define    INTF7        7
#define    INTF6        6
#define    INTF5        5
#define    INTF4        4

/* Timer/Counter Interrupt MaSK register */
#define    OCIE2        7
#define    TOIE2        6
#define    TICIE1       5
#define    OCIE1A       4
#define    OCIE1B       3
#define    TOIE1        2
#define    OCIE0        1
#define    TOIE0        0

/* Timer/Counter Interrupt Flag Register */
#define    OCF2         7
#define    TOV2         6
#define    ICF1         5
#define    OCF1A        4
#define    OCF1B        3
#define    TOV1         2
#define    OCF0         1
#define    TOV0         0

/* Extended Timer Interrupt MaSK register */
#define    TICIE3       5
#define    OCIE3A       4
#define    OCIE3B       3
#define    TOIE3        2
#define    OCIE3C       1
#define    OCIE1C       0

/* Extended Timer Interrupt Flag Register */
#define    ICF3         5
#define    OCF3A        4
#define    OCF3B        3
#define    TOV3         2
#define    OCF3C        1
#define    OCF1C        0

/* MCU general Control Register */
#define    SRE          7
#define    SRW          6
#define    SE           5
#define    SM1          4
#define    SM0          3
#define    SM2          2
#define    IVSEL        1
#define    IVCE         0

/* MCU Status Register */
#define    JTD          7
#define    JTRF         4
#define    WDRF         3
#define    BORF         2
#define    EXTRF        1
#define    PORF         0

/* Timer/Counter Control Register */
#define    FOC          7
#define    WGM0         6
#define    COM1         5
#define    COM0         4
#define    WGM1         3
#define    CS2          2
#define    CS1          1
#define    CS0          0

/* Timer/Counter 0 Asynchronous Control & Status Register */
#define    AS0          3
#define    TCN0UB       2
#define    OCR0UB       1
#define    TCR0UB       0

/* Timer/Counter Control Register A */
#define    COMA1        7
#define    COMA0        6
#define    COMB1        5
#define    COMB0        4
#define    COMC1        3
#define    COMC0        2
#define    WGMA1        1
#define    WGMA0        0

/* Timer/Counter Control and Status Register B */
#define    ICNC         7
#define    ICES         6
#define    WGMB3        4
#define    WGMB2        3
#define    CSB2         2
#define    CSB1         1
#define    CSB0         0

/* Timer/Counter Control Register C */
#define    FOCA         7
#define    FOCB         6
#define    FOCC         5

/* On-chip Debug Register */
#define    OCDR7        7
#define    OCDR6        6
#define    OCDR5        5
#define    OCDR4        4
#define    OCDR3        3
#define    OCDR2        2
#define    OCDR1        1
#define    OCDR0        0

/* Watchdog Timer Control Register */
#define    WDCE         4
#define    WDE          3
#define    WDP2         2
#define    WDP1         1
#define    WDP0         0

/* Special Function I/O Register */
#define    TSM          7
#define    ADHSM        4
#define    ACME         3
#define    PUD          2
#define    PSR0         1
#define    PSR321       0

/* EEPROM Control Register */
#define    EERIE        3
#define    EEMWE        2
#define    EEWE         1
#define    EERE         0

/* Port Data Register */
#define    PORT7        7
#define    PORT6        6
#define    PORT5        5
#define    PORT4        4
#define    PORT3        3
#define    PORT2        2
#define    PORT1        1
#define    PORT0        0

/* Port Data Direction Register */
#define    DD7          7
#define    DD6          6
#define    DD5          5
#define    DD4          4
#define    DD3          3
#define    DD2          2
#define    DD1          1
#define    DD0          0

/* Port Input Pins */
#define    PIN7         7
#define    PIN6         6
#define    PIN5         5
#define    PIN4         4
#define    PIN3         3
#define    PIN2         2
#define    PIN1         1
#define    PIN0         0

/* Status Register */
#define    SREG_I       7
#define    SREG_T       6
#define    SREG_H       5
#define    SREG_S       4
#define    SREG_V       3
#define    SREG_N       2
#define    SREG_Z       1
#define    SREG_C       0

/* SPI Status Register */
#define    SPIF         7
#define    WCOL         6
#define    SPI2X        0

/* SPI Control Register */
#define    SPIE         7
#define    SPE          6
#define    DORD         5
#define    MSTR         4
#define    CPOL         3
#define    CPHA         2
#define    SPR1         1
#define    SPR0         0

/* USART Register C */
#define    UMSEL        6
#define    UPM1         5
#define    UPM0         4
#define    USBS         3
#define    UCSZ1        2
#define    UCSZ0        1
#define    UCPOL        0

/* USART Status Register A */
#define    RXC          7
#define    TXC          6
#define    UDRE         5
#define    FE           4
#define    OVR          3    /* This definition differs from the databook */
  /*definition to avoid problems with the OR instruction */

/* USART Control Register */
#define    RXCIE        7
#define    TXCIE        6
#define    UDRIE        5
#define    RXEN         4
#define    TXEN         3
#define    UCSZ         2
#define    RXB8         1
#define    TXB8         0

/* Analog Comparator Control and Status Register */
#define    ACD          7
#define    ACBG         6
#define    ACO          5
#define    ACI          4
#define    ACIE         3
#define    ACIC         2
#define    ACIS1        1
#define    ACIS0        0

/* ADC Control and status register */
#define    ADEN         7
#define    ADSC         6
#define    ADFR         5
#define    ADIF         4
#define    ADIE         3
#define    ADPS2        2
#define    ADPS1        1
#define    ADPS0        0

/* ADC Multiplexer select */
#define    REFS1        7
#define    REFS0        6
#define    ADLAR        5
#define    MUX4         4
#define    MUX3         3
#define    MUX2         2
#define    MUX1         1
#define    MUX0         0

/* Pointer definition */
#define    XL       r26
#define    XH       r27
#define    YL       r28
#define    YH       r29
#define    ZL       r30
#define    ZH       r31

/* Constants */
#define    RAMEND   0x10FF     /* Last On-Chip SRAM Location */
#define    XRAMEND  0xFFFF
#define    E2END    0x0FFF
#define    FLASHEND 0x1FFFF

#endif /* __IOM128 */
all: tmain.hex tmain-bad.hex

tmain.hex: tmain.elf
        avr-objcopy -O ihex tmain.elf tmain.hex

tmain.elf: tmain.c linker.cmd
        avr-gcc -g -I/home/speja/local/i586-pc-linux-gnu/include -save-temps 
-mmcu=atmega128 -o $@ -Wl,"-Tlinker.cmd" 
-L/home/speja/local/i586-pc-linux-gnu/lib/avr5 tmain.c

tmain-bad.hex: tmain.c linker.cmd
        avr-gcc -g -I/home/speja/local/i586-pc-linux-gnu/include -save-temps 
-mmcu=atmega128 -o $@ -Wl,"-Tlinker.cmd","--oformat","ihex" 
-L/home/speja/local/i586-pc-linux-gnu/lib/avr5 tmain.c


.PHONY: clean
clean:
        rm -rf tmain.hex tmain.elf tmain-bad.hex


/* Default linker script, for normal executables */
/* OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") */
/*OUTPUT_FORMAT("ihex")*/

OUTPUT_ARCH(avr:5)

MEMORY
{
  /* Flash memory, Application Flash Section */
  text   (rx)   : ORIGIN = 0,        LENGTH = 128K
  /* Flash memory, Boot Flash Section */
  /* Register set */
  registers     : ORIGIN = 0, LENGTH = 32
  /* I/O Registers */
  ioregisters   : ORIGIN = 0x20, LENGTH = 64
  /* Ext. I/O Registers */
  extioregisters : ORIGIN = 0x60, LENGTH = 160
  /* Internal SRAM (Added 0x800000 to avoid linker warning) */
  data   (rw!x) : ORIGIN = 0x801100, LENGTH = 4K

  /* External bus */
  extmem (rw!x) : ORIGIN = 0x801100, LENGTH = 0xffff-0x1100
  /* eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K */
}

SECTIONS
{
  /* Read-only sections, merged into text segment: */

  /* Internal text space or external memory */
  .text :
  {
/*     *(.init)*/
    . = ALIGN(2);
    *(.init0)  /* Start here after reset.  */
    *(.init1)
    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */
    *(.init3)
    *(.init4)  /* Initialize data and BSS.  */
    *(.init5)
    *(.init6)  /* C++ constructors.  */
    *(.init7)
    *(.init8)
    *(.init9)  /* Call main().  */
    *(.text)
    . = ALIGN(2);
    *(.text.*)
    . = ALIGN(2);
    *(.fini9)  /* _exit() starts here.  */
    *(.fini8)
    *(.fini7)
    *(.fini6)  /* C++ destructors.  */
    *(.fini5)
    *(.fini4)
    *(.fini3)
    *(.fini2)
    *(.fini1)
    *(.fini0)  /* Infinite loop after program termination.  */
     _etext = . ;
  }  > text
/*  .data         : AT (ADDR (.text) + SIZEOF (.text)) */
  .data   :
  {
     PROVIDE (__data_start = .) ;
    *(.data)
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
     _edata = . ;
     PROVIDE (__data_end = .) ;
  }  > data
  .bss  /* SIZEOF(.data) + ADDR(.data) */ :
  {
     PROVIDE (__bss_start = .) ;
    *(.bss)
    *(COMMON)
     PROVIDE (__bss_end = .) ;
  }  > data
   __data_load_start = LOADADDR(.data);
   __data_load_end = __data_load_start + SIZEOF(.data);
  /* Global data not cleared after reset.  */
  .noinit  /* SIZEOF(.bss) + ADDR(.bss) */ :
  {
     PROVIDE (__noinit_start = .) ;
    *(.noinit*)
     PROVIDE (__noinit_end = .) ;
     _end = . ;
     PROVIDE (__heap_start = .) ;
  }  > data
  .eeprom  :
        /* AT (ADDR (.text) + SIZEOF (.text) + SIZEOF (.data)) */
  {
    *(.eeprom*)
     __eeprom_end = . ;
  }  > eeprom
  /* Stabs debugging sections.  */
  .stab 0 : { *(.stab) }
  .stabstr 0 : { *(.stabstr) }
  .stab.excl 0 : { *(.stab.excl) }
  .stab.exclstr 0 : { *(.stab.exclstr) }
  .stab.index 0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment 0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
  PROVIDE (__stack = 0x8010ff) ; 
/*  PROVIDE (__stack = ADDR(data)+LENGTH(data)) ; */
}
:1000000011241FBE20E0A89521BD20E025BF3EE1C0
:10001000F0E030E0A0F1C16031603BBF02C007906A
:100020000D92A041B207D9F7A0F1C160316001C0C3
:100030001D92A041B207E1F72D9400002C9400001E
:02004000189511
:10004200BFF1E060DEBFCDBF8FEF809337008091BC
:0C00520038008F5F80933800FACFFFCF9A
:10005E000C9400002A9400002A9400002A940000B8
:10006E002A9400002A9400002A9400002A9400008A
:10007E002A9400002A9400002A9400002A9400007A
:10008E002A9400002A9400002A9400002A9400006A
:10009E002A9400002A9400002A9400002A9400005A
:1000AE002A9400002A9400002A9400002A9400004A
:1000BE002A9400002A9400002A9400002A9400003A
:1000CE002A9400002A9400002A9400002A9400002A
:0C00DE002A9400002A9400002A940000DC
:00000001FF
:1000000011241FBE20E0A89521BD20E025BFEEE50C
:10001000F0E030E0A0E0B1E121E13BBF02C0079099
:100020000D92A030B207D9F7A0E0B1E121E101C003
:100030001D92A030B207E1F70C9421000C9420002F
:100040001895CFEFD0E1DEBFCDBF8FEF80933700A3
:0E005000809138008F5F80933800FACFFFCF89
:10005E000C9400000C941E000C941E000C941E00B8
:10006E000C941E000C941E000C941E000C941E008A
:10007E000C941E000C941E000C941E000C941E007A
:10008E000C941E000C941E000C941E000C941E006A
:10009E000C941E000C941E000C941E000C941E005A
:1000AE000C941E000C941E000C941E000C941E004A
:1000BE000C941E000C941E000C941E000C941E003A
:1000CE000C941E000C941E000C941E000C941E002A
:0C00DE000C941E000C941E000C941E00DC
:00000001FF

reply via email to

[Prev in Thread] Current Thread [Next in Thread]