есть ли в linux замена _chkstk? Если есть то раскажите как использовать... А то у меня при компиляции появляется сообщение undefined reference to `_chkstk'
заимствовано из сырцов ядра. систематическое расстыкивание по коду в нужных местах приводит к проверке на тему развала стека и buffer overflow. решение в определённом смысле стандартное
мне в общем то нужна не проверка а выделение дополнительной стековой памяти если мне потребуется больше 4к!(что собственно эта функция и выполняет в виндовс)
есть такой файл в chkstk.asm(в поставке компиляторов как билдера так и студии), сейчас попробую использовать его
MSDN:chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4096 bytes; for AMD64 and IA64 compilers it is 4K and 8K respectively.
Хм... Все скомпилировалось и скомпоновалось , но работать почему то все равно не хочет 'segmentation fault', и мне кажется что беда все таки с этим _chkstk, может в линуксе надо проверять не на 4К а на другое число?
>MSDN:chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4096 bytes; for AMD64 and IA64 compilers it is 4K and 8K respectively.
а какое это имеет отношение к линуксу???
>А вчем собственно проблема? беру нужныей мне код из chkstk.asm оформляю его как процедуру, отдаю его nasm а затем прилинковываю его к проекту...
при ваших вопросах я думал что вас на такое не хватит
в линукс стек увеличивается ядром автоматически на любую допустимую величину. тоесть выделить 1Мегабайт в стеке обычно не требует никаких дополнительных притопов а только разрешение от рута/сисадмина.
максимальный размер стека для каждого юзера в отдельности задаётся сисадмином/рутом(жёсткий лимит), при этом в пределах этого максимума каждый юзер для каждого приложения может динамически изменять максимальный размер стека при превышении которого процес кажись получит SIGSEGV(мягкий лимит).
все эти манипуляции выполняются сисколом setrlimit(RLIMIT_STACK)
ещё можешь посмотреть man ulimit && help ulimit в bash.
PS:ещё внимательно изучите опции компилера/линкера на тему стека
В общем у меня такая проблема: Я пишу на ассемблере и мне в функции требуется создать массив на 16кб, вот я и ищу средство... В виндовсе я просто вызываю _chkstk а тут не знаю... Подскажите если знаете...
>Я пишу на ассемблере
почему на ассемблере?
я думал что на сях, в асме я хромаю
>Я пишу на ассемблере и мне в функции требуется создать массив на 16кб, вот я и ищу средство...
локальный для ф-и?? сделайте по аналогии с досом. кажись надо напрямую модифицировать ESP.
или ещё проще: создайте ф-ю на С оттранслируйте в ассемблер и посмотрите:
$cat tmp.c
void f(void){
char arr[16*1024];
memset(arr,0,sizeof(arr));
}
$gcc -S tmp.c
$cat tmp.s
.file "tmp.c"
.version "01.01"
gcc2_compiled.:
.text
.align 4
.globl f
.type f,@function
f:
pushl %ebp
movl %esp, %ebp
subl $16392, %esp
subl $4, %esp
pushl $16384
pushl $0
leal -16392(%ebp), %eax
pushl %eax
call memset
addl $16, %esp
leave
ret
.Lfe1:
.size f,.Lfe1-f
.ident "GCC: (GNU) 2.96 20000731 (ASPLinux 7.3 2.96-112)"
насколько я понял то это делается инструкцией:
subl $16392, %esp
ps: почему думаю что в этом месте? потому что это единственное место которое пришлось заменить при компиляции под линукс. В виндовс все работает хорошо...
корка (core) это такой служебный файл который может создать операционка если приложение умирает по sigsegv. этот файл позволяет восстановить картину на момент падения, например кто и где обратился по адресу NULL ну и всё прочее с этим связанное
bt в gdb может показать цепочку вызовов до ф-и в которой произошол sigsegv