Tag
Hier mal, wie er die C-Dateien kompiliert:
[ 77%] Building C object src/phys_mm/CMakeFiles/kernel_pmm.dir/pmm_functions.c.o
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/gcc -I/home/daniel/Projekte/Programmieren/Kernel/inc -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -m32 -O3 -o CMakeFiles/kernel_pmm.dir/pmm_functions.c.o -c /home/daniel/Projekte/Programmieren/Kernel/src/phys_mm/pmm_functions.c
/usr/bin/cmake -E cmake_progress_report /home/daniel/Projekte/Programmieren/Kernel/build/CMakeFiles 9
[ 88%] Building C object src/phys_mm/CMakeFiles/kernel_pmm.dir/pmm_init.c.o
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/gcc -I/home/daniel/Projekte/Programmieren/Kernel/inc -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -m32 -O3 -o CMakeFiles/kernel_pmm.dir/pmm_init.c.o -c /home/daniel/Projekte/Programmieren/Kernel/src/phys_mm/pmm_init.c
Linking C static library libkernel_pmm.a
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/cmake -P CMakeFiles/kernel_pmm.dir/cmake_clean_target.cmake
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/cmake -E cmake_link_script CMakeFiles/kernel_pmm.dir/link.txt --verbose=1
/usr/bin/ar cr libkernel_pmm.a CMakeFiles/kernel_pmm.dir/pmm_functions.c.o CMakeFiles/kernel_pmm.dir/pmm_init.c.o
/usr/bin/ranlib libkernel_pmm.a
make[2]: Verlasse Verzeichnis '/home/daniel/Projekte/Programmieren/Kernel/build'
/usr/bin/cmake -E cmake_progress_report /home/daniel/Projekte/Programmieren/Kernel/build/CMakeFiles 8 9
Im Unterstrichenen Part sieht man, wie er die einzelnen Dateien kompiliert. Das sieht soweit richtig aus.
Im kursiven Part liegt meiner Ansicht nach der Fehler.
Dort linkt er die Object Files nämlich zu einer (Linuxspezifischen)statischen Library.
"Normalerweise" müsste das so ablaufen:
Per gcc -c werden die *.o Dateien kompiliert, und die werden am Ende ALLE von ld zu einem Objectfile gelinkt (elf_i386).
Das zweite Problem liegt bei den Assemblerdateien. Die werden einfach ignoriert. Das es dann nicht funktionieren kann, ist klar:
/usr/bin/ld: warning: cannot find entry symbol kernelentry; defaulting to 0000000000100000
Laut Linkerskript gehts bei kernelentry los, das befindet sich aber in einer asm-Datei...
Und von der wird iwie nirgendwo was erwähnt, nichtmal ein Fehler...??
Ich muss CMake also jetzt dazu bringen:
Meine C-Dateien einzeln zu kompilieren und dann erst am Ende zu linken, und zwar so, wie ich es sage.
Meine Asm-Dateien überhaupt mal zu kompilieren.
Zum Problem mit dem linken:
Ich führe out-of-source Builds durch.
D.h. alle Objectdateien kommen nach build/.
Also müsste es doch gehen, wenn ich ein custom_command hinzufüge, das per find alle Dateien, die auch .o enden findet und an die "Dateiliste" von ld (mit meinen Parametern) anhängt...?
Muss ich das auch für jede .c Datei und gcc machen...?