Вопрос по gcc локальной переменной массива и встроенных функций при связывании с собственными файлами .ids - PullRequest
0 голосов
/ 28 февраля 2019

Я использую gcc для компиляции функции печати.Но встретились следующие 2 проблемы:

  1. Всякий раз, когда я применяю локальную переменную типа массива, компоновщик сообщал и сообщал об ошибке " неопределенная ссылка на` __stack_chk_fail ' "
  2. Когда я использую "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 = .;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...