Я использую gcc для компиляции функции печати.Но встретились следующие 2 проблемы:
- Всякий раз, когда я применяю локальную переменную типа массива, компоновщик сообщал и сообщал об ошибке " неопределенная ссылка на` __stack_chk_fail ' "
- Когда я использую "inline" для определения функции, он сообщает об ошибке " неопределенная ссылка на` strlen ' "
Моя платформа - Ubuntu 18.04, иверсия gcc - 7.3.0.
Я представляю некоторые коды проблем:
В функции "number ()" я применил переменную массива типа "char", которая фактически вызывает первую ошибку:
char* number(char *str, long num, int base, int field_width, int precision, int type)
{
char *TempDgt = DigitsCptl, c, sign;
int i;
char TempStr[50];
....
return str;
}
Проблема заключается в "char TempStr [50];"и с его удалением ссылка удалась.Подобная проблема появляется в "va_list args;"следующего кода:
int color_printk(unsigned int FRcolor, unsigned int BKcolor, char * fmt, ...)
{
int count, i, line;
va_list args;
...
return i;
}
Вторая проблема заключается в функции "strlen" следующим образом:
inline int strlen(char * String)
{
...
return __res;
}
На этот раз дескриптор "inline" вызвал проблему.
Обе проблемы возникают в инструкции "ld", следующий мой make-файл:
Kernel:
# Clear previous files
- rm head.s head.o main.o system kernel.bin printk.o
# Compile head.S
gcc -E ./OSFiles/Codes/head.S > head.s
as --64 -o head.o head.s
# Compile main function
gcc -mcmodel=large -fno-builtin -m64 -c ./OSFiles/Codes/main.c
gcc -mcmodel=large -fno-builtin -m64 -c ./OSFiles/Codes/printk.c
# Link compiled files
ld -b elf64-x86-64 -z muldefs -o system head.o main.o printk.o -T ./OSFiles/Codes/Kernel.lds
# Dump out Kernel.bin
objcopy -I elf64-x86-64 -S -R ".eh_frame" -R ".comment" -O binary system Kernel.bin
и файл .ids:
OUTPUT_FORMAT("elf64-x86-64","elf64-x86-64","elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SECTIONS
{
. = 0xffff800000000000 + 0x100000;
.text :
{
_text = .;
*(.text)
_etext = .;
}
.data :
{
_data = .;
*(.data)
_edata = .;
}
.bss :
{
_bss = .;
*(.bss)
_ebss = .;
}
_end = .;
}