Als Fortsetzung unter neuem Titel nach neuem Thema zum Ende des Threads
Beitrag "Re: Zu viele Symbole werden gestrippt (Code zu klein)"
Nach einigen Schwierigkeiten bei dem Thema wollte ich diese Lösung zur
Diskussion präsentieren.
@ Volker: Ich wechsele hier in einen neuen Thread, da das Topic zu
unserem Thema nicht mehr ganz passend war ;-)
"Kurz" umrissen sieht meine derzeitige Lösung wie folgt aus:
Mein frisch installiertes Cygwin Version 2.852 (64bit) mit letztlich
folgenden Paketen samt ihrer Abhängigkeiten:
1 | # autoconf 13-1
|
2 | # automake 9-1
|
3 | # make 4.0-2
|
4 | # cygwin32-gcc-core 4.8.3-4
|
5 | # cygwin32-g++-core 4.8.3-4
|
6 | # gcc-core 4.8.3-5
|
7 | # g++-core 4.8.3-5
|
8 | # w32api-runtime-debuginfo 3.2.0-1
|
9 | # mingw64-x86_64-gcc-core (4.8.3-1)
|
10 | # mingw64-x86_64-gcc-core-debuginfo (4.8.3-1)
|
11 | # mingw64-x86_64-g++-core (4.8.3-1)
|
12 | # cygwin32-libbfd (2.23.51-1)
|
13 | # gdb (7.8-2)
|
Der in Cygwin verwendete GCC meldet bei "gcc -v":
1 | Es werden eingebaute Spezifikationen verwendet.
|
2 | COLLECT_GCC=gcc
|
3 | COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/lto-wrapper.exe
|
4 | Ziel: x86_64-pc-cygwin
|
5 | Konfiguriert mit: /cygdrive/i/szsz/tmpp/gcc_old/gcc-4.8.3-5.x86_64/src/gcc-4.8.3/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc_old/gcc-4.8.3-5.x86_64/src/gcc-4.8.3 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --libdir=/usr/lib --datarootdir=/usr/share --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-tune=generic --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-graphite --enable-threads=posix --enable-libatomic --enable-libgomp --disable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --enable-libada --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id
|
6 | Thread-Modell: posix
|
7 | gcc-Version 4.8.3 (GCC)
|
Zusätzlich noch ein MinGW(x86_64-w64-mingw32) von
http://sourceforge.net/projects/tdm-gcc/
Der verwendete GCC meldet bei "gcc -v":
1 | Using built-in specs.
|
2 | COLLECT_GCC=gcc
|
3 | COLLECT_LTO_WRAPPER=C:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/4.9.2/lto-wrapper.exe
|
4 | Target: x86_64-w64-mingw32
|
5 | Configured with: ../../../src/gcc-4.9.2/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=http://tdm-gcc.tdragon.net/bugs
|
6 | Thread model: posix
|
7 | gcc version 4.9.2 (tdm64-1)
|
In ein extra Verzeichnis wurden folgende Pakete direkt von Sourceforge
aus dem Code-tree heruntergeladen und entpackt:
1 | avarice-code-347-trunk
|
2 | libusb-win32-code-413-trunk
|
Den sehr häufig wiederholten Bauprozess des avarice hab ich in ein
Skript gebannt.
Hier hatte ich erst die gleichen Aufrufe wie auf der Seite verwendet
(relative Pfade):
http://www.nongnu.org/avr-libc/user-manual/install_tools.html
Dann habe ich es, wegen Ungereimtheiten beim auffinden der
libusb-Sourcen, mit absoluten Pfaden angegeben, Ausschnitt:
1 | ...
|
2 | # export startdir=$HOME/build/libusb-win32-bin-1.2.6.0
|
3 | # export CPPFLAGS=-g" -I$startdir/include"
|
4 | # export CFLAGS=-g" -I$startdir/include"
|
5 | # export LDFLAGS="-static -L$startdir/lib/gcc "
|
6 |
|
7 | export startdir=$HOME/build/libusb-win32-code-413-trunk/libusb
|
8 | export CPPFLAGS=-I"$startdir/src"
|
9 | export CFLAGS=-I"$startdir/src"
|
10 | export LDFLAGS="-static -L$startdir "
|
11 | ...
|
Wegen folgender Fehlermeldung habe ich eine Änderung an den
Avarice-Sourcen vorgenommen (gekürzter Ausschnitt):
1 | ...
|
2 | In file included from ../../src/jtag2usb.cc:51:0:
|
3 | /usr/include/w32api/usb.h:29:9: Fehler: »PVOID« bezeichnet keinen Typ
|
4 | typedef PVOID PIRP;
|
5 | ^
|
6 | /usr/include/w32api/usb.h:30:9: Fehler: »PVOID« bezeichnet keinen Typ
|
7 | typedef PVOID PMDL;
|
8 | ^
|
9 | In file included from /usr/include/w32api/usb200.h:23:0,
|
10 | from /usr/include/w32api/usb.h:36,
|
11 | from ../../src/jtag2usb.cc:51:
|
12 | ...
|
Anpassung in "...\avarice\src\jtag2usb.cc": "usb.h" raus, dafür
"lusb0_usb.h" rein
1 | #ifdef HAVE_LIBUSB_2_0
|
2 | # include <libusb20.h>
|
3 | # include <libusb20_desc.h>
|
4 | # include <poll.h>
|
5 | #else
|
6 | # include "lusb0_usb.h"
|
7 | //# include <usb.h>
|
8 | #endif
|
Das Bauen von "libusb-win32-code-413-trunk/libusb" per Cygwin schmeißt
folgenden Fehler:
1 | $ make
|
2 | gcc -O2 -Wall -DWINVER=0x500 -DLOG_APPNAME=\"libusb0-dll\" -DTARGETTYPE=DYNLINK -c ./src/usb.c -o usb.2.o -I./src -I./src/driver -I.
|
3 | In file included from ./src/usb.c:14:0:
|
4 | ./src/usbi.h:10:23: Fehler: In Konflikt stehende Typen für »uint32_t«
|
5 | typedef unsigned long uint32_t;
|
6 | ^
|
7 | In file included from /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/stdint.h:9:0,
|
8 | from /usr/include/cygwin/types.h:20,
|
9 | from /usr/include/sys/types.h:481,
|
10 | from /usr/include/stdio.h:48,
|
11 | from ./src/usb.c:10:
|
12 | /usr/include/stdint.h:34:22: Anmerkung: Vorherige Deklaration von »uint32_t« war hier
|
13 | typedef unsigned int uint32_t;
|
14 | ^
|
15 | Makefile:139: recipe for target 'usb.2.o' failed
|
16 | make: *** [usb.2.o] Error 1
|
Dafür baut es mittels MinGW(x86_64-w64-mingw32) durch einen Aufruf per
mingw32-make.exe in einer separaten Konsole (normale Windows-Shell,
nicht Cygwin) durch.
Jetzt kann ich Avarice wie zuvor beschrieben in Cygwin per Configure und
make durchbauen.
Meine Fallstricke waren:
- Der verwendete native Compiler gcc (x86_64-pc-cygwin-gcc.exe) konnte
beim Configure-Aufruf des Avarice nicht die libusb.a einbinden.
- bei den Pfadangaben für den Configure-Aufruf wurden relative Pfade (
../../Ziel) verwendet und haben zusätzlich zur Verwirrung beigetragen.
- Fehlende Datentypbeschreibungen, vermutlich durch fehlender
"windows.h", daher Änderung des Include in jtag2usb.cc" aus "usb.h" wird
ein "lusb0_usb.h".
- Der Compiler x86_64-pc-cygwin-gcc.exe in cygwin baut bei mir nicht die
"libusb-win32-code-413-trunk" -> Bauen durch MinGW(x86_64-w64-mingw32)
- Kollision mit einem make.exe aus einer anderen GNU-Toolchain, ->
Aufruf mingw32-make.exe im Verzeichnis
Somit erhalte ich folgende Datei-Details:
1 | $ Datei=~/install/bin/avarice; ls -l $Datei;echo;file $Datei; echo ;ldd $Datei
|
2 |
|
3 | -rwxr-xr-x 1 user Domain Users 1472325 13. Mrz 16:05 /home/user/install/bin/avarice
|
4 |
|
5 | /home/user/install/bin/avarice: PE32+ executable (console) x86-64, for MS Windows
|
6 |
|
7 | ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x76ed0000)
|
8 | kernel32.dll => /cygdrive/c/WINDOWS/system32/kernel32.dll (0x76b90000)
|
9 | KERNELBASE.dll => /cygdrive/c/WINDOWS/system32/KERNELBASE.dll (0x7fefd420000)
|
10 | libusb0.dll => /cygdrive/c/WINDOWS/system32/libusb0.dll (0x6a480000)
|
11 | msvcrt.dll => /cygdrive/c/WINDOWS/system32/msvcrt.dll (0x7feff140000)
|
12 | SETUPAPI.dll => /cygdrive/c/WINDOWS/system32/SETUPAPI.dll (0x7fefd9e0000)
|
13 | CFGMGR32.dll => /cygdrive/c/WINDOWS/system32/CFGMGR32.dll (0x7fefd600000)
|
14 | RPCRT4.dll => /cygdrive/c/WINDOWS/system32/RPCRT4.dll (0x7fefd890000)
|
15 | ADVAPI32.dll => /cygdrive/c/WINDOWS/system32/ADVAPI32.dll (0x7fefee70000)
|
16 | sechost.dll => /cygdrive/c/WINDOWS/SYSTEM32/sechost.dll (0x7fefd9c0000)
|
17 | GDI32.dll => /cygdrive/c/WINDOWS/system32/GDI32.dll (0x7fefebf0000)
|
18 | USER32.dll => /cygdrive/c/WINDOWS/system32/USER32.dll (0x767d0000)
|
19 | LPK.dll => /cygdrive/c/WINDOWS/system32/LPK.dll (0x7fefef70000)
|
20 | USP10.dll => /cygdrive/c/WINDOWS/system32/USP10.dll (0x7fefdd30000)
|
21 | OLEAUT32.dll => /cygdrive/c/WINDOWS/system32/OLEAUT32.dll (0x7fefef80000)
|
22 | ole32.dll => /cygdrive/c/WINDOWS/system32/ole32.dll (0x7fefec60000)
|
23 | DEVOBJ.dll => /cygdrive/c/WINDOWS/system32/DEVOBJ.dll (0x7fefd6e0000)
|
24 | cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
|
25 | IMM32.DLL => /cygdrive/c/WINDOWS/system32/IMM32.DLL (0x7feff110000)
|
26 | MSCTF.dll => /cygdrive/c/WINDOWS/system32/MSCTF.dll (0x7fefd700000)
|
Ein Aufruf sieht dann so aus:
1 | $ avarice.exe -r -3
|
2 | AVaRICE version 2.13svn20141210, Mar 13 2015 16:22:38
|
3 |
|
4 | Defaulting JTAG bitrate to 250 kHz.
|
5 |
|
6 | JTAG config starting.
|
7 | Found a device, serial number: J30200028833
|
8 | Reported device ID: 0x9403
|
9 | Configured for device ID: 0x9403 atmega16
|
10 | JTAG config complete.
|
11 |
|
12 | Reading Fuse Bytes:
|
13 | High Fuse byte -> 0x10
|
14 | Low Fuse byte -> 0x6f
|
Feedback und Verbesserungsvorschläge sind gern gesehen.
Gruß
Sebastian