Forum: PC-Programmierung Wie bestimmte GCC Version nutzen? Docker?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ich bräuchte mal Unterstützung dabei, wie ich eine bestimmte GCC Version 
nutzen kann die ich brauche, um einen Canadian Cross zu generieren, also 
einen Compiler mit Build ≠ Host ≠ Target ≠ Build.

Den benötigten Build → Target Compiler kann ich selbst generieren.  Was 
mir zur Erzeugung des Host → Target Compilers fehlt ist der Build → Host 
Compiler, nämlich https://packages.msys2.org/packages/mingw-w64-i686-gcc

Für den benötigten Cross Compiler gibt es also Packages zur 
Installation, allerdings kann ich auf Build keine Software installieren, 
und die Admins sind beschränkt auf Debian, für welches es kein 
mingw-w64-i686-gcc Paket gibt.

Soweit ich das verstehe, wäre Docker eine Möglichkeit.  Allerdings habe 
ich noch nie was mit Docker gemacht, und beim Lesen der Tutorials dreh 
ich mich im Kreis und komme vom Hölzchen aufs Stöckchen.

Vielleicht findet sich ja hier im Forum jemand, der den Nerv hat, nem 
Docker Dummy den Weg zu weisen...

Build-Rechner: Debian 6.12.32-1 (2025-06-07) x86_64 GNU/Linux amd64

Mein lokaler Rechner ist ein x86_64 GNU/Linux mit Docker v27.5.1.

Mein Ziel ist es, auf Build (effektiv) Kommandos wie mingw-w64-i686-g++, 
mingw-w64-i686-ld etc. ausführen zu können.

von Alexander S. (alesi)


Lesenswert?

Hallo Johann,

mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite

https://packages.debian.org/search?keywords=mingw-w64

https://packages.debian.org/sid/mingw-w64
This metapackage provides the MinGW-w64 development environment, 
including C and C++ compilers.

https://packages.debian.org/sid/gcc-mingw-w64
This metapackage provides the C compiler, supporting cross-compiling to 
32- and 64-bit MinGW-w64 targets.

oder hilft das nur hier für

Johann L. schrieb:
> Den benötigten Build → Target Compiler kann ich selbst generieren.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Alexander S. schrieb:
> mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite
>
> https://packages.debian.org/search?keywords=mingw-w64
>
> https://packages.debian.org/sid/mingw-w64
> This metapackage provides the MinGW-w64 development environment,
> including C and C++ compilers.
>
> https://packages.debian.org/sid/gcc-mingw-w64
> This metapackage provides the C compiler, supporting cross-compiling to
> 32- and 64-bit MinGW-w64 targets.

Das scheinen zumindest die benötigten Compiler zu sein; ich geh mal 
davon aus, dass auch die benötigten Binutils dabei sind? Was aber auf 
jeden Fall auch gebraucht wird ist die Windows Laufzeitumgebung mit 
kernel32.dll etc, weil man ohne die kein lauffähiges Programm 
hinbekommt.

Und wenn ich nach i686-mingw oder i386-mingw suche wird auf der Seite 
nix gefunden...

> oder hilft das nur hier für
>
> Johann L. schrieb:
>> Den benötigten Build → Target Compiler kann ich selbst generieren.

Nein, mit MinGW hat das nix zu tun.  Der Build → Target Compiler wird 
gebraucht, um Target-Bibliotheken des zu bauenden Canadian Cross zu 
übersetzen (libgcc, libc, libm, ...).  Die Target-Libs können ja nicht 
mit dem Canadian Cross selbst erzeugt werden, weil der ja auf i686-mingw 
läuft.

von Foka M. (foka)


Lesenswert?

Johann L. schrieb:
> Alexander S. schrieb:
>> mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite
>>
>> https://packages.debian.org/search?keywords=mingw-w64
>
> Das scheinen zumindest die benötigten Compiler zu sein; ich geh mal
> davon aus, dass auch die benötigten Binutils dabei sind? Was aber auf
> jeden Fall auch gebraucht wird ist die Windows Laufzeitumgebung mit
> kernel32.dll etc, weil man ohne die kein lauffähiges Programm
> hinbekommt.

Die kernel32.dll brauchst Du nicht zum erstellen von windows binaries. 
Das brauchst Du erst wenn Du sie lauffen lassen willst. Das entweder auf 
einer windows kiste oder in `wine`.

Binutils und 'development files' sind im debian repo in entsprechenden 
Paketen auch dabei:
1
aptitude search binutils-mingw
2
p   binutils-mingw-w64                                                                                          - Cross-binutils for Win32 and Win64 using MinGW-w64                                                                    
3
p   binutils-mingw-w64-i686                                                                                     - Cross-binutils for Win32 (x86) using MinGW-w64                                                                        
4
p   binutils-mingw-w64-i686:i386                                                                                - Cross-binutils for Win32 (x86) using MinGW-w64                                                                        
5
p   binutils-mingw-w64-x86-64                                                                                   - Cross-binutils for Win64 (x64) using MinGW-w64                                                                        
6
p   binutils-mingw-w64-x86-64:i386                                                                              - Cross-binutils for Win64 (x64) using MinGW-w64

Das hier sollte alles liefern um unter Linux fremde Windows binaries zu 
erzeugen. Es zieht die binutils, und vieles mehr, als dependency schon 
an.
1
aptitude install mingw-w64-common mingw-w64-tools gcc-mingw-w64

> Und wenn ich nach i686-mingw oder i386-mingw suche wird auf der Seite
> nix gefunden...

Das waer `mingw.*i686` oder so:
1
aptitude search mingw.*i686|grep "win32.*i386"
2
p  g++-mingw-w64-i686-win32:i386 - GNU C++ compiler for MinGW-w64, Win32/Win32
3
p  gcc-mingw-w64-i686-win32:i386 - GNU C compiler for MinGW-w64, Win32/Win32
4
p  gcc-mingw-w64-i686-win32-runtime:i386 - GNU Compiler Collection for MinGW-w64, i686/Win32
5
p  gfortran-mingw-w64-i686-win32:i386 - GNU Fortran compiler for MinGW-w64, Win32/Win32
6
p  gnat-mingw-w64-i686-win32:i386 - GNU Ada compiler for MinGW-w64, Win32/Win32
7
p  gobjc++-mingw-w64-i686-win32:i386 - GNU Objective-C++ compiler for MinGW-w64, Win32/Win32
8
p  gobjc-mingw-w64-i686-win32:i386 - GNU Objective-C compiler for MinGW-w64, Win32/Win32

Falls Du es im Docker haben willst, dann `Dockerfile`:
1
# Use a base image
2
FROM debian:testing-slim
3
4
# Install necessary tools
5
RUN apt-get update && apt-get install -y --no-install-recommends \
6
    mingw-w64-common mingw-w64-tools gcc-mingw-w64 \
7
    passwd sudo && \
8
    rm -rf /var/lib/apt/lists/*
9
10
# Copy an entrypoint script
11
COPY entrypoint.sh /entrypoint.sh
12
RUN chmod +x /entrypoint.sh
13
14
# Set the entrypoint
15
ENTRYPOINT ["/entrypoint.sh"]
16
17
# Default command
18
CMD ["bash"]

Und das dazugehoerige `entrypoint.sh` muss direkt neben dem Dockerfile 
liegen:
1
#!/bin/bash
2
# Create a user with the same UID and GID as the host user
3
USER_ID=${LOCAL_UID:-9001}
4
GROUP_ID=${LOCAL_GID:-9001}
5
USER_NAME=${LOCAL_USER_NAME:-"anonuser"}
6
GROUP_NAME=${LOCAL_GROUP_NAME:-"anongrouppie"}
7
8
USER_HOME="/home/${USER_NAME}"
9
10
groupadd -g $GROUP_ID "${GROUP_NAME}"
11
useradd -u $USER_ID -g $GROUP_ID -m "${USER_NAME}"
12
13
# allow sudo without a password for $USER_NAME
14
# echo "${USER_NAME} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${USER_NAME}
15
16
# login as $USER_NAME
17
cd "${USER_HOME}"
18
exec sudo -u ${USER_NAME} -i "$@"

Das geht alles noch viel kuerzer, ich mag aber im Docker meinen eigenen 
usernamen haben. Falls im docker entweder root oder ein spezieller 
`dockeuser` kann all das groupadd und useradd ins Dockerfile verschoben 
werden.

Bauen und starten. Im gleichen Verzeichnis in dem das Dockerfile liegt:
1
docker build -t myimage .
2
docker run -it -e LOCAL_UID=$(id -u) -e LOCAL_GID=$(id -g) -e LOCAL_USER_NAME=$(id -un) -e LOCAL_GROUP_NAME=$(id -gn) myimage

-foka

Update: typo behoben.

: Bearbeitet durch User
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Zum erstellen diverser GCC Compiler verwenden wir hier 
https://github.com/crosstool-ng/crosstool-ng/. Das erleichtert die Sache 
ungemein und funktioniert auch ohne Docker inkl. Canadian-Cross.

Matthias

von Rbx (rcx)


Lesenswert?

Ich verstehe sowieso nicht ganz, was das soll hier. Soll das eine 
theoretische Arbeit werden?

Beispielsweise: Plattformen A B und C und C wäre dann Docker oder eine 
VM?? Oder B?? Oder doch eher A??
-> Vorschlag: zuerstmal etwas mehr Plan in das Vorhaben hineinbringen, 
das kann man den zum ersten viel besser kommunizieren, und zweitens, 
lohnt es sich auch erst dann, nach weiteren Informationen im Netz zu 
suchen, wenn eben klarer ist, wo man überhaupt hin will.

Ich versuche mal einen Ansatz:
Also die Entwicklungsumgebung ist beschränkt, welche Möglichkeiten hast 
du trotzdem, Crosscompiling zu machen?

Kannst du die Admins diesbezüglich ausfragen, oder ist das nicht 
erwünscht?

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Johann L. schrieb:
> Soweit ich das verstehe, wäre Docker eine Möglichkeit.
Dock ist hier völlig überflüssig.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Foka M. schrieb:
> Johann L. schrieb:
>> Alexander S. schrieb:
>>> mir ist nicht ganz klar was Du genau suchst, aber kennst Du diese Seite
>>>
>>> https://packages.debian.org/search?keywords=mingw-w64
>>
>> Das scheinen zumindest die benötigten Compiler zu sein; ich geh mal
>> davon aus, dass auch die benötigten Binutils dabei sind? Was aber auf
>> jeden Fall auch gebraucht wird ist die Windows Laufzeitumgebung mit
>> kernel32.dll etc, weil man ohne die kein lauffähiges Programm
>> hinbekommt.
>
> Die kernel32.dll brauchst Du nicht zum erstellen von windows binaries.

Also wenn ich eine main.c mit i686-w64-mingw32-gcc übersetze:
1
$ i686-w64-mingw32-gcc main.c -v
2
...
3
/usr/bin/i686-w64-mingw32-ld ... -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 ... -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 ...
Sieht für mich so aus also würde gegen die Host-Libs gelinkt.

> docker run -it -e LOCAL_UID=$(id -u) -e LOCAL_GID=$(id -g) -e

Kann man auch ein Executable erstellen anstatt docker aufzurufen?  Weil 
Docker ist nicht installiert auf dem Build-Rechner, und ich kann da 
keine Software installieren:  Katze beißt sich in den Schwanz...

von Foka M. (foka)


Lesenswert?

Johann L. schrieb:
> Also wenn ich eine main.c mit i686-w64-mingw32-gcc übersetze:
>
1
> $ i686-w64-mingw32-gcc main.c -v
2
> ...
3
> /usr/bin/i686-w64-mingw32-ld ... -plugin-opt=-pass-through=-lmsvcrt 
4
> -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 
5
> -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 
6
> -plugin-opt=-pass-through=-lmingw32 ... -lmsvcrt -ladvapi32 -lshell32 
7
> -luser32 -lkernel32 ...
8
>
> Sieht für mich so aus also würde gegen die Host-Libs gelinkt.

Sieht nur so aus:
1
/usr/bin/i686-w64-mingw32-gcc-win32 --verbose wattauchimmer.c
2
...
3
LIBRARY_PATH=/usr/lib/gcc/i686-w64-mingw32/12-win32/:/usr/lib/gcc/i686-w64-mingw32/12-win32/../../../../i686-w64-mingw32/lib/../lib/:/usr/lib/gcc/i686-w64-mingw32/12-win32/../../../../i686-w64-mingw32/lib/
4
...

Und in diesen pfaden sind entsprechende windows libraries. Das sollte 
normalerweise unter Windows mit einem installierten mingw auch vorhanden 
sein.
Ich habe gerade ein keines `*.c` compiliert, welches nur per printf ein 
float ausgibt, und wenn ich es mit wine lauffen lasse scheint es zu 
funktionieren:
1
wine ./a.exe 
2
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
3
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
4
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
5
00b8:fixme:wineusb:query_id Unhandled ID query type 0x5.
6
'024.33'
Ich habe jetzt hier kein windows um es gegen zu checken, aber ich wuerde 
davon ausgehen, dass es tut was es soll.

>
>> docker run -it -e LOCAL_UID=$(id -u) -e LOCAL_GID=$(id -g) -e
>
> Kann man auch ein Executable erstellen anstatt docker aufzurufen?  Weil
> Docker ist nicht installiert auf dem Build-Rechner, und ich kann da
> keine Software installieren:  Katze beißt sich in den Schwanz...

Auf die Gefahr hin, dass es jetzt ausartet, weil ich eigentlich immer 
noch keine Ahnung habe was Du wirklich machen willst, und Angenommen 
Dein Build-Recher ist ein deb-basierte Linux-Kiste:
Hast Du auf dem Build-Rechner etwas Platz in deinem Home? Falls ja dann 
kannst Du auf einem anderen deb basierten Linux Rechner, auf dem Du SW 
nachinstallieren kannst:
1
apt install apt-rdepends
2
apt-rdepends gcc-mingw-w64 | grep Depends| sort | uniq
Das erzeugt eine Liste aller Pakete die notwendig sind um den mingw-gcc 
lauffen zu lassen. Diese Pakete kannst Du herunterladen `apt install 
--download-only` (die landen dann irgendwo in /var/cache/apt) und diese 
auf den Buld-Recher verschieben.
Auf dem Zielrechner kannst Du sie mit `dpkg -X packetName.deb 
$HOME/mingwOderSo` entpacken.
Damit sollte ein mingw-gcc lokal in Deinem Home existieren. Evtl. musst 
Du noch mit `LD_LIBRARY_PATH` oder `LD_PRELOAD` herumspielen, damit alle 
libs gefunden werden. Der compiler wird auch seine system-includes/libs 
nicht finden, dh. mehrere `-I` und `-L` werden notwendig sein. Ich hoffe 
das Funktioniert, ich habe es nicht ausprobiert ;-)

Ansonsten, um einfach einen, zum Beispiel, avr-gcc fuer windows zu 
bauen, wuerde ich auch keinen Docker verwenden. So wie ich es allerdings 
verstehe, hast Du eine dedizierte Build-Kiste, oder sogar mehrere davon. 
In dem Fall wuerde ich mal mit dem Admin reden, das er Dir Docker 
installiert. IMHO, hat es den Vorteil, dass Du images auf der 
'build-farm' verteilen kannst und die SW bauen wie Du willst.

-foka

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Alexander S. schrieb:
> https://packages.debian.org/search?keywords=mingw-w64
>
> https://packages.debian.org/sid/mingw-w64
> This metapackage provides the MinGW-w64 development environment,
> including C and C++ compilers.

Danke für die Links.  Ich hab mal den Admin angetickert ob er das 
installieren kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.