Линковка C функций в C++(казусы при линковке всего этого с ассемблером)
Есть 3 файла: gdt.h; init.cpp; boot.S
В boot.S:
Код:
.global gdt_flush
gdt_flush:
gdt_flush:
Код:
extern void gdt_flush(u32int);
Проблемы идут с линковкой, в принципе причина ясна, при компиляции С++ накладывает манглинг(или как-то так называется), в связи с чем линкер не может
найти такую вот абракадабру(пример): %@%%#t_fl@us%#. Что надо поставить перед функцией в файле gdt.h, чтобы она линковалась без манглинга?
compile.sh
Код:
cd boot
i568-elf-as -o boot.o boot.S
cd ..
i586-elf-g++ -c init.cpp -o init.o -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti
i586-elf-g++ -T linker.ld -o myos.bin -ffreestanding -nostdlib -O2 boot/boot.o init.o
i568-elf-as -o boot.o boot.S
cd ..
i586-elf-g++ -c init.cpp -o init.o -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti
i586-elf-g++ -T linker.ld -o myos.bin -ffreestanding -nostdlib -O2 boot/boot.o init.o
В MAsm'е была опция, ответственная за соглашения о вызовах, и если выбрать stdcall, то эта проблема уходит. Как-то так, могу немного ошибаться, но дома проверю.
extern "C" void gdt_flush(u32int);
Цитата: xAtom
extern "C" void gdt_flush(u32int);
Спасибо, помогло.