Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[bash] ld - naruszenie ochrony pamięci

Ostatnio zmodyfikowano 2014-04-08 10:56
Autor Wiadomość
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ła
Oto 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"
P-107884
alixir
» 2014-04-08 09:48:12
Odejdę troszkę od pytania, ale nie dało się tego zrobić przy użyciu Makefile? 
P-107886
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.
P-107888
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
P-107889
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.
P-107892
« 1 »
  Strona 1 z 1