Kompilierung von Linux mit selbst gebauten GCC (x86_64-none-elf) nicht möglich

OP #7614848
Lesenswert?

Hallo Community!

Versuche gerade Linux mit einem selbst gebauten GCC zu kompilieren. Klappt allerdings nicht, da immer bei manchen Assembler Quellen Fehler ausgegeben werden (Beispiel):

1
$ make CROSS_COMPILE=x86_64-none-elf-
2
  SYNC    include/config/auto.conf.cmd
3
  HOSTCC  scripts/kconfig/conf.o
4
  HOSTLD  scripts/kconfig/conf
5
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_32.h
6
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_64.h
7
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_x32.h
8
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
9
  SYSHDR  arch/x86/include/generated/asm/unistd_32_ia32.h
10
  SYSHDR  arch/x86/include/generated/asm/unistd_64_x32.h
11
  SYSTBL  arch/x86/include/generated/asm/syscalls_64.h
12
  SYSTBL  arch/x86/include/generated/asm/syscalls_x32.h
13
  HYPERCALLS arch/x86/include/generated/asm/xen-hypercalls.h
14
[...]
15
  CC      arch/x86/entry/vdso/vdso-image-32.o
16
  AR      arch/x86/entry/vdso/built-in.a
17
  CC      arch/x86/entry/vsyscall/vsyscall_64.o
18
  AS      arch/x86/entry/vsyscall/vsyscall_emu_64.o
19
  AR      arch/x86/entry/vsyscall/built-in.a
20
  AS      arch/x86/entry/entry.o
21
  AS      arch/x86/entry/entry_64.o
22
arch/x86/entry/entry_64.S: Assembler messages:
23
arch/x86/entry/entry_64.S:380: Error: unbalanced parenthesis in operand 1.
24
arch/x86/entry/entry_64.S:163:  Info: macro invoked from here
25
arch/x86/entry/entry_64.S:265:   Info: macro invoked from here
26
arch/x86/entry/entry_64.S:382: Error: unbalanced parenthesis in operand 1.
27
arch/x86/entry/entry_64.S:163:  Info: macro invoked from here
28
arch/x86/entry/entry_64.S:265:   Info: macro invoked from here
29
make[3]: *** [scripts/Makefile.build:387: arch/x86/entry/entry_64.o] Error 1
30
make[2]: *** [scripts/Makefile.build:505: arch/x86/entry] Error 2
31
make[1]: *** [scripts/Makefile.build:505: arch/x86] Error 2
32
make: *** [Makefile:2039: .] Error 2
33
$

Hat jemand eine Idee, an was es liegen könnte? Falsch gebaute GNU Toolchains? Mit dem System eigenen GCC von Debian 12, klappt alles problemlos.

GCC Version:

1
$ x86_64-none-elf-gcc --version
2
x86_64-none-elf-gcc (GCC) 13.2.0
3
Copyright (C) 2023 Free Software Foundation, Inc.
4
This is free software; see the source for copying conditions.  There is NO
5
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6
$

binutils (GAS) Version:

1
$ x86_64-none-elf-as --version
2
GNU assembler (GNU Binutils) 2.41
3
Copyright (C) 2023 Free Software Foundation, Inc.
4
This program is free software; you may redistribute it under the terms of
5
the GNU General Public License version 3 or later.
6
This program has absolutely no warranty.
7
This assembler was configured for a target of `x86_64-none-elf'.
8
$

Vielen Dank im voraus!

OP #7614896
Lesenswert?

Hmmm schrieb im Beitrag #7614876: [...]

Johannes K. schrieb:

This assembler was configured for a target of `x86_64-none-elf'.

Klingt nach dem falschem Target.

Okay. Mir erschliesst aber nicht wirklich, was an *-none-elf falsch ist. Dachte nämlich immer die *-linux-gnu Konfigurationen betreffen lediglich die Bibliotheken. Meine damit, dass *-linux-gnu für die Entwicklung für Applikationen unter einen GNU/Linux System konfiguriert ist und *-none-elf für Bare-Metal Projekte. Für mich wäre Linux genau genommen ein Bare-Metal Projekt.

Von daher verstehe ich es nicht, warum die Kompilierung mit *-none-elf nicht klappt, da Linux ja selber seine verwendeten Bibliotheken (libc, libgcc, ...) mitliefert.

Wenn ich vom Fehler die betreffende Zeile im Quellcode (als Beispiel Zeile 380 von entry_64) ansehe, sehe ich kein "Error: unbalanced parenthesis in operand 1". (Ohne Durchlauf mit dem C-Präpozessor ist die Zeile 380 innerhalb eines Kommentar und mit Durchlauf eine leere Zeile.)

Ist zwar OT, wäre aber durchaus für mich von Vorteil, wenn jemand erklären könnte, was genau die Unterschiede von *-none-elf und *-linux-gnu genau sind.

#7614897
Lesenswert?

Johannes K. schrieb:

Dachte nämlich immer die *-linux-gnu Konfigurationen betreffen lediglich die Bibliotheken.

Nein, da können auch Syntax-Variationen dranhängen...

Johannes K. schrieb:

ist die Zeile 380 innerhalb eines Kommentar

...im Fall des Assemblers z.B. auch die zulässigen Prefixes für Kommentare.

Johannes K. schrieb:

Ist zwar OT, wäre aber durchaus für mich von Vorteil, wenn jemand erklären könnte, was genau die Unterschiede von *-none-elf und *-linux-gnu genau sind.

Da musst Du Dich evtl. durch die Target-Konfigurationen wühlen, in der binutils-Doku finde ich spontan nur die CPU-spezifischen Sachen.

#7615299
Lesenswert?

Johannes K. schrieb:

Hat jemand eine Idee, an was es liegen könnte?

Compiler/Binutils flasch konfiguriert.

Die "none" Targets sind für System ganz ohne Betriebssystem gedacht - üblicherweise sind das kleinere µC (wie Arm Cortex-M) aber man könnte auch X86 so betreiben.

Der Linux Kernel ist nicht dafür gedacht mit so einem Compiler übersetzt zu werden und fliegt Dir deshalb bei ein paar Compiler Macros um die Ohren.

Der Compiler wird erheblich besser funktionieren wenn man aus dem "none" ein "linux" macht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren