OSX mountain lionでAVRのコンパイル

http://awawa.hariko.com/eclipse_avr.html を参考に


crtm168.o(-mmcu=atmega168を指定した時)とかcrttn2313.o(-mmcu=attiny2313を指定した時)
とかがないと言われるので、
この2つを/usr/local/AVR/avr/libに置く。
そしてなぜかArduinoのライブラリの場所を指定するとうまくいく。
(ライブラリを2回見ている?)

テストファイル
copy.cの中身

% cat copy.c
#include<avr/io.h>

int main(void) {
  uint8_t i;
  i = 0;
  DDRB = 0xff;
  while (1) {
    i++;
    PORTB = i;
  }
}

コンパイル

% avr-gcc -L /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/lib/ -mmcu=attiny2313 copy.c

または最適化

% avr-gcc -L /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/lib/ -mmcu=attiny2313 copy.c -O2 -Os 

hex生成

% avr-objcopy -R .eeprom -O ihex a.out copy.hex

できた

% cat copy.hex
:1000000012C017C016C015C014C013C012C011C052
:1000100010C00FC00EC00DC00CC00BC00AC009C07C
:1000200008C007C006C011241FBECFEDCDBF02D04F
:1000300007C0E6CF8FEF87BB80E08F5F88BBFDCF27
:04004000F894FFCF62
:00000001FF

アセンブル

% avr-objdump -d a.out

a.out:     ?&#1381;???????? elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0:	12 c0       	rjmp	.+36     	; 0x26 <__ctors_end>
   2:	17 c0       	rjmp	.+46     	; 0x32 <__bad_interrupt>
   4:	16 c0       	rjmp	.+44     	; 0x32 <__bad_interrupt>
   6:	15 c0       	rjmp	.+42     	; 0x32 <__bad_interrupt>
   8:	14 c0       	rjmp	.+40     	; 0x32 <__bad_interrupt>
   a:	13 c0       	rjmp	.+38     	; 0x32 <__bad_interrupt>
   c:	12 c0       	rjmp	.+36     	; 0x32 <__bad_interrupt>
   e:	11 c0       	rjmp	.+34     	; 0x32 <__bad_interrupt>
  10:	10 c0       	rjmp	.+32     	; 0x32 <__bad_interrupt>
  12:	0f c0       	rjmp	.+30     	; 0x32 <__bad_interrupt>
  14:	0e c0       	rjmp	.+28     	; 0x32 <__bad_interrupt>
  16:	0d c0       	rjmp	.+26     	; 0x32 <__bad_interrupt>
  18:	0c c0       	rjmp	.+24     	; 0x32 <__bad_interrupt>
  1a:	0b c0       	rjmp	.+22     	; 0x32 <__bad_interrupt>
  1c:	0a c0       	rjmp	.+20     	; 0x32 <__bad_interrupt>
  1e:	09 c0       	rjmp	.+18     	; 0x32 <__bad_interrupt>
  20:	08 c0       	rjmp	.+16     	; 0x32 <__bad_interrupt>
  22:	07 c0       	rjmp	.+14     	; 0x32 <__bad_interrupt>
  24:	06 c0       	rjmp	.+12     	; 0x32 <__bad_interrupt>

00000026 <__ctors_end>:
  26:	11 24       	eor	r1, r1
  28:	1f be       	out	0x3f, r1	; 63
  2a:	cf ed       	ldi	r28, 0xDF	; 223
  2c:	cd bf       	out	0x3d, r28	; 61
  2e:	02 d0       	rcall	.+4      	; 0x34 <main>
  30:	07 c0       	rjmp	.+14     	; 0x40 <_exit>

00000032 <__bad_interrupt>:
  32:	e6 cf       	rjmp	.-52     	; 0x0 <__vectors>

00000034 <main>:
  34:	8f ef       	ldi	r24, 0xFF	; 255
  36:	87 bb       	out	0x17, r24	; 23
  38:	80 e0       	ldi	r24, 0x00	; 0
  3a:	8f 5f       	subi	r24, 0xFF	; 255
  3c:	88 bb       	out	0x18, r24	; 24
  3e:	fd cf       	rjmp	.-6      	; 0x3a <main+0x6>

00000040 <_exit>:
  40:	f8 94       	cli

00000042 <__stop_program>:
  42:	ff cf       	rjmp	.-2      	; 0x42 <__stop_program>