Как связать объектный файл c с объектным файлом c ++? - PullRequest
0 голосов
/ 09 июля 2019

Я пишу маленькое «ядро», которое отображает «Hello world!»на экране.У меня есть работающая функция putc (put char), поэтому я могу сделать это (и я сделал это) с 12 вызовами функций putc, но я хочу сделать это с помощью функции put (put string), и я хочу написать ее на C ++.Я знаю, что могу сделать это на C, но в будущем мне понадобится C с C ++ связыванием ... Так почему бы не сделать это прямо сейчас?

Вот мой код kernel.c:

extern void putc(char, char);
extern void puts(char*, char);
extern void clear(void);

void start_kernel(void)
{

  clear();
  puts("Hello world!", 7);
  putc('H', 7);
  putc('e', 7);
  putc('l', 7);
  putc('l', 7);
  putc('o', 7);
  putc(' ', 7);
  putc('w', 7);
  putc('o', 7);
  putc('r', 7);
  putc('l', 7);
  putc('d', 7);
  putc('!', 7);

  for(;;);

}

Я изменил код put.cpp так, чтобы он отображал на экране первую букву строки ... но это не так ... put.cpp:

extern "C" void putc(char, char);

extern "C"
{

  void puts(char *s, char color)
  {

    putc(*s, 7);

  }

}

Сценарий link.bash:

nasm start.asm -f elf64 -o start.o
nasm putc.asm -f elf64 -o putc.o
nasm clear.asm -f elf64 -o clear.o
gcc puts.cpp -std=c++0x -c -o puts.o
gcc kernel.c -O3 -fomit-frame-pointer -masm=intel -c -o kernel.o
ld -Tkernel.ld -o kernel.bin start.o kernel.o putc.o puts.o clear.o

После генерации iso, запустив его с qemu-system-x86_64 -hdd kernel.iso, он отображает странный символ (каждый раз тот же) и Hello world!Конечно, после размещения этой функции в файле kernel.c она отображает мир HHello!

Интересно то, что после замены gcc на clang ++ (для put.cpp) он отображает еще один странный символ (также каждый раз такой же)

Может кто-нибудь сказать мне, как правильно связать эти файлы?

edit:

Я забыл добавить, что после замены содержимого функции put () на putc ('a', 7);он правильно отображает эту букву, что является проблемой с аргументами.

...