[bash] ld - naruszenie ochrony pamięci
Ostatnio zmodyfikowano 2014-04-08 10:56
kubawal Temat założony przez niniejszego użytkownika |
[bash] ld - naruszenie ochrony pamięci » 2014-04-08 09:17:08 Witam! Piszę sobie własnego OS'a który ma już dosyć dużo pilków źródłowych, więc napisałem sobie skrypt w bashu żeby to wszystko zautomatyzować. Mój skrypt obsługiwał kompilacje, linkowanie, czyszczenie plików .o i pakowanie do .iso za pomocą grub-mkrescue. Skrypt działał. Jednak zauważyłem w nim pewny błąd. Moj skrypt wykrywał, czy pilk .o nie został z poprzedniej(nieudenej) kompilacji, a jeśli tak, to go wykorzystywał. Jednak jeśli błąd był w jakimś innym, już skompilowanym pliku, to trzeba go było skasować ręcznie. Dlatego chciałem dodać opcję -all, jednak nie za bardzo mi szło i wróciłem do poprzedniej wersji. Jednak, kiedy próbuję linkowac używając ld wyświetla mi się: 3876 Naruszenie ochrony pamięci ld -T$linkScript -o $out ${asmOut[*]} ${cppOut[*]} ${extLibs[*]} Zaznaczam, że poprzednia wersja, taka sama działałaOto mój kod: #!/bin/bash
#### Dane
# Istniejące biblioteki extObjs=( "Extlibs/FatFs/ff.o" "Extlibs/bget/bget.o" )
# kod C++ cppSrc=( "kernel.cpp" "Driv/interrupt.cpp" "Driv/textmode.cpp" "API/string.cpp" "Driv/keyboard.cpp" "Driv/memory.cpp" "Driv/ata.cpp" "Shell/shell.cpp" "Int/systemInts.cpp" "Int/exc.cpp" "gdt.cpp" "Driv/PIT.cpp" "Driv/filesystem.cpp" )
# output C++ cppOut=( "kernel.o" "Driv/interrupt.o" "Driv/textmode.o" "API/string.o" "Driv/keyboard.o" "Driv/memory.o" "Driv/ata.o" "Shell/shell.o" "Int/systemInts.o" "Int/exc.o" "gdt.o" "Driv/PIT.o" "Driv/filesystem.o" ) gccOpts="-c -nostdinc -fomit-frame-pointer -O2 -std=c++11 -I API/"
# kod ASM asmSrc=("boot.asm" "API/asmAPI.asm" "Int/intDefs.asm" "Int/exc.asm" ) asmOut=("boot.o" "API/asmAPI.o" "Int/intDefs.o" "Int/excasm.o" )
# linkowanie linkScript="link.ld"
# wyjście isoFolder="Build" out="Build/boot/grub/myos.bin" outIso="MyOS.iso"
#### Wykonywanie
echo -e "\e[1mŹródła: " ${asmSrc[*]} ${cppSrc[*]} "\e[0m"
# asm for((count=0; count<${#asmSrc[*]}; count++)) do if [ -f ${asmOut[$count]} ] then echo -e "\e[34m\e[1m" ${asmSrc[$count]} "\e[0m\e[34mjuż skompilowane. Pomijanie...\e[0m" else echo -e "Kompilacja: \e[1m" ${asmSrc[$count]} "\e[0m" res= nasm -f elf -o ${asmOut[$count]} ${asmSrc[$count]} echo -e "\e[34mKompilacja\e[1m" ${asmSrc[$count]} "\e[0m\e[34mzakończona powodzeniem.\e[0m" fi done
# c++ for((count=0; count<${#cppSrc[*]}; count++)) do if [ -f ${cppOut[$count]} ] then echo -e "\e[34m\e[1m" ${cppSrc[$count]} "\e[0m\e[34mjuż skompilowane. Pomijanie...\e[0m" else echo -e "Kompilacja: \e[1m" ${cppSrc[$count]} "\e[0m" if g++ -o ${cppOut[$count]} ${cppSrc[$count]} $gccOpts; then echo -e "\e[34mKompilacja\e[1m" ${cppSrc[$count]} "\e[0m\e[34mzakończona powodzeniem.\e[0m" else echo -e "\e[31mKompilacja\e[1m" ${cppSrc[$count]} "\e[0m\e[31mnieudana. Stop.\e[0m" exit 1; fi fi done
# linkuj echo -e "\e[1mLinkowanie...\e[0m" if ld -T$linkScript -o $out ${asmOut[*]} ${cppOut[*]} ${extLibs[*]} then echo -e "\e[34mLinkowanie zakończone powodzeniem.\e[0m" else echo -e "\e[31mLinkowanie nieudane. Stop\e[0m" for((count=0; count<${#asmOut[*]}; count++)) do rm ${asmOut[$count]} done for((count=0; count<${#cppOut[*]}; count++)) do rm ${cppOut[$count]} done exit 1; fi
# czyść echo -e "\e[1mCzyszczenie...\e[0m" for((count=0; count<${#asmOut[*]}; count++)) do rm ${asmOut[$count]} done for((count=0; count<${#cppOut[*]}; count++)) do rm ${cppOut[$count]} done
echo -e "\e[34mCzyszczenie zakończone powodzeniem.\e[0m"
# stwórz obraz echo -e "\e[1mPakowanie...\e[0m" grub-mkrescue -o $outIso $isoFolder
echo -e "\e[1mWykonano.\e[0m"
|
|
alixir |
» 2014-04-08 09:48:12 Odejdę troszkę od pytania, ale nie dało się tego zrobić przy użyciu Makefile? |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-04-08 09:58:58 Nie chciało mi się uczyć od początku tego całego języku makefile, a basha już troche znałem. Poza tym przy okazji obsługuje mi pakowanie. |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-04-08 10:07:25 Próbowałem też wyłączyć czyszczenie i linkować ręcznie - ten sam błąd
/edit: dodam, że tak naprawdę Linux jest na VM'ce, a pracuję w folderze udostępnianym za pomocą VBox guest additions |
|
alixir |
» 2014-04-08 10:56:49 Gdzieś widziałem ładny tutorial Makefile nawet do skomplikowanych projektów i myślę, że dodanie do niego pakowania nie stanowi problemu. Co do twojego problemu to szczerze nie mam pojęcia, ale może rzeczywiście wirtualizacja ma coś do rzeczy. |
|
« 1 » |