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


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Johannes K. (krotti42)


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!

von Hmmm (hmmm)


Lesenswert?

Johannes K. schrieb:
> arch/x86/entry/entry_64.S:380: Error: unbalanced parenthesis in operand
> 1.

Johannes K. schrieb:
> This assembler was configured for a target of `x86_64-none-elf'.

Klingt nach dem falschem Target.

von Johannes K. (krotti42)


Lesenswert?

Hmmm schrieb:
[...]
> 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.

von Hmmm (hmmm)


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.

von Jim M. (turboj)


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.

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.