Автор Тема: Проблем с линкването  (Прочетена 995 пъти)

victim70

  • Напреднали
  • *****
  • Публикации: 454
  • Distribution: Gentoo, Ubuntu
  • Window Manager: Kde Xfce
    • Профил
Проблем с линкването
« -: Nov 08, 2011, 21:38 »
След ъпдейт ми се появи странен проблем с линкването на програми.
Става въпрос за avr-gcc
при опит за компилиране стигам до тука
Цитат
$ make
avr-gcc -Wl,-Map,labelrollm8.out.map -lm  -mmcu=atmega8 -o labelrollm8.out main.o timers.o   
/usr/libexec/gcc/avr/ld: cannot find crtm8.o: No such file or directory
collect2: ld returned 1 exit status
make: *** [labelrollm8.out] Error 1

Пускам последната стъпка с малко повече опции за да проговори

Цитат
$ avr-gcc -v -Wl,-Map,labelrollm8.out.map -lm  -mmcu=atmega8 -o labelrollm8.out main.o timers.o
Using built-in specs.
COLLECT_GCC=/usr/i686-pc-linux-gnu/avr/gcc-bin/4.5.3/avr-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/avr/4.5.3/lto-wrapper
Target: avr
Configured with: /var/tmp/portage/cross-avr/gcc-4.5.3-r1/work/gcc-4.5.3/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/avr/gcc-bin/4.5.3 --includedir=/usr/lib/gcc/avr/4.5.3/include --datadir=/usr/share/gcc-data/avr/4.5.3 --mandir=/usr/share/gcc-data/avr/4.5.3/man --infodir=/usr/share/gcc-data/avr/4.5.3/info --with-gxx-include-dir=/usr/lib/gcc/avr/4.5.3/include/g++-v4 --host=i686-pc-linux-gnu --target=avr --build=i686-pc-linux-gnu --disable-altivec --disable-fixed-point --without-ppl --without-cloog --disable-lto --disable-nls --with-system-zlib --disable-werror --enable-secureplt --disable-multilib --disable-libmudflap --disable-libssp --disable-libgomp --with-python-dir=/share/gcc-data/avr/4.5.3/python --enable-checking=release --disable-libgcj --enable-languages=c,c++ --enable-shared --disable-threads --disable-bootstrap --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.5.3-r1 p1.0, pie-0.4.5'
Thread model: single
gcc version 4.5.3 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5)
COMPILER_PATH=/usr/libexec/gcc/avr/4.5.3/:/usr/libexec/gcc/avr/4.5.3/:/usr/libexec/gcc/avr/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/
LIBRARY_PATH=/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/4.5.3/../../../../avr/lib/
COLLECT_GCC_OPTIONS='-v' '-mmcu=atmega8' '-o' 'labelrollm8.out'
 /usr/libexec/gcc/avr/4.5.3/collect2 -m avr4 -o labelrollm8.out crtm8.o -L/usr/lib/gcc/avr/4.5.3 -L/usr/lib/gcc/avr/4.5.3/../../../../avr/lib -Map labelrollm8.out.map -lm main.o timers.o -lgcc -lc -lgcc
/usr/libexec/gcc/avr/ld: cannot find crtm8.o: No such file or directory
collect2: ld returned 1 exit status

Виждам че се дъни на линкването и го пускам и то да приказва:

Цитат
$ /usr/libexec/gcc/avr/4.5.3/collect2 -verbose -m avr4 -o labelrollm8.out crtm8.o -L/usr/lib/gcc/avr/4.5.3 -L/usr/lib/gcc/avr/4.5.3/../../../../avr/lib -Map labelrollm8.out.map -lm main.o timers.o -lgcc -lc -lgcc
GNU ld (GNU Binutils) 2.21.1
  Supported emulations:
   avr2
   avr1
   avr25
   avr3
   avr31
   avr35
   avr4
   avr5
   avr51
   avr6
opened script file /usr/i686-pc-linux-gnu/avr/binutils-bin/2.21.1//ldscripts/avr4.x
using external linker script:
==================================================
/* Default linker script, for normal executables */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:4)
MEMORY
{
  text   (rx)   : ORIGIN = 0, LENGTH = 8K
  data   (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0
  eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K
}
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  .hash          : { *(.hash)           }
  .dynsym        : { *(.dynsym)         }
  .dynstr        : { *(.dynstr)         }
  .gnu.version   : { *(.gnu.version)    }
......................резнато за компактност - няма нищо интересно
 .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
}

==================================================
attempt to open crtm8.o failed
attempt to open /usr/lib/gcc/avr/4.5.3/libm.so failed
attempt to open /usr/lib/gcc/avr/4.5.3/libm.a failed
attempt to open /usr/lib/gcc/avr/4.5.3/../../../../avr/lib/libm.so failed
attempt to open /usr/lib/gcc/avr/4.5.3/../../../../avr/lib/libm.a succeeded
attempt to open main.o succeeded
main.o
attempt to open timers.o succeeded
timers.o
attempt to open /usr/lib/gcc/avr/4.5.3/libgcc.so failed
attempt to open /usr/lib/gcc/avr/4.5.3/libgcc.a succeeded
(/usr/lib/gcc/avr/4.5.3/libgcc.a)_copy_data.o
(/usr/lib/gcc/avr/4.5.3/libgcc.a)_clear_bss.o
attempt to open /usr/lib/gcc/avr/4.5.3/libc.so failed
attempt to open /usr/lib/gcc/avr/4.5.3/libc.a failed
attempt to open /usr/lib/gcc/avr/4.5.3/../../../../avr/lib/libc.so failed
attempt to open /usr/lib/gcc/avr/4.5.3/../../../../avr/lib/libc.a succeeded
attempt to open /usr/lib/gcc/avr/4.5.3/libgcc.so failed
attempt to open /usr/lib/gcc/avr/4.5.3/libgcc.a succeeded
/usr/bin/avr-ld: cannot find crtm8.o: No such file or directory
collect2: ld returned 1 exit status

В същност виждам че файла crtm8.o неможе да го намери а го има

Цитат
$ls -l /usr/avr/lib/avr4/crtm8.o
-rw-r--r-- 1 root root 1924  8 ное  2,28 /usr/avr/lib/avr4/crtm8.o
$

Поставям го с копиране при сорса и всичко се оправя.

Въпроса е такъв къде да линкна тази папка с библиотеки за да не го копирам в сорса? Или префразирано как да задам на линкера да търси тези файлове (те зависят от типа на процесора) в директорията /usr/avr/lib ? Или трети вариянт как да разбера къде трябва да е локацията на тези обектни файлове?

Като малко пояснение това са библиотеки за управлението на стека на микроконтролера, и зависи за каква платформа га покзвам тази библиотека е различна. А аз компилирам един и същи код за различни платформи.

Ще се радвам ако някой има някаква идея, правилата за 'нормалното' gcc са същите няма никаква разлика, така че това че е за контролер да не смущава никой.
Активен

"Господи, дай ми сила да променя нещата които немога да приема,
дай ми търпение да приема нещата които не мога да променя,
и ми дай мъдрост, да правя разликата между двете"