линковка после компиляции, без стандартных библиотек

#include "calls.h"

enum { size = 1024 };

char expression[size];
char result[size];
const char *exp_cc;
const char *res_cc = result;

int chars_to_num(const char *s, int *num);
int solve_polska(const char *s);

int main()
{
        int i;
        int num = 0;
        sys_read(0, expression, size);
        for(i = 0; expression[i]; i++){
                exp_cc = expression + i;
                i += chars_to_num(exp_cc, &num);
        }
        return 0;
}

int chars_to_num(const char *s, int *num)
{
        int i = -1;
        for(; *s >= 0x30 && *s <= 0x39; s++, i++)
                *num = (*num) * 10 + (*s - 0x30);
        return i;
}

Пишу программу для решения произвольного выражения где на входе есть цифры и сиволы '+', '-', '*', '/', '(', ')'. На входе будет строка, пытаюсь для начала сделать функцию для преобразования строкового числа в конкретное число.

Программа не может использовать библиотечные возможности, у меня есть только аналоги системных вызовов write и read, а так же ассемблерный модуль который вызвыает функцию main.

При компиляции всех модулей для получения объектных файлов всё впорядке, ошибок нет. Так же sys_read(мой read) и sys_write(мой write) работают нормально.

Вот вопрос: при линковке командой ld -m elf_i386 main.o start.o calls.o -o main выдаются ошибки:

ld: main.o: in function `main':

main.c:(.text+0xa3): undefined reference to `__stack_chk_fail_local'

ld: main: hidden symbol `__stack_chk_fail_local' isn't defined

ld: final link failed: bad value

Я понимаю что дело в функции, если её закоментировать, то всё соберётся и нормально запустится, просто причитается строка, запишется в expression[size], пройдется циклом по ней и завершится программа. Но не понимаю что не так и что не нравится линковщику при вызове этой функции.

UPD:

Я понял... int num = 0 нужно было объявить глобально... Но что мешало при объявлении внутри main я не понял.

Еще не совсем понимаю можно ли константному указателю присваивать указатель не константного массива, а так же можно ли передавать указатель неконстантного массива в функцию, которая ожидает константный указатель. Компилятор просто при этом не ругается и линковщик тоже, но насколько это правильно вообще делать.


Ответы (0 шт):