линковка после компиляции, без стандартных библиотек
#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 я не понял.
Еще не совсем понимаю можно ли константному указателю присваивать указатель не константного массива, а так же можно ли передавать указатель неконстантного массива в функцию, которая ожидает константный указатель. Компилятор просто при этом не ругается и линковщик тоже, но насколько это правильно вообще делать.