LINUX.ORG.RU

puppy 2.4.29 - gcc + pascal - ?


0

0

В дебиане ленни ядро 2.6.18 сомпилю софт на pascal - утилитка для работы с терминалом. Она наромально работает на puppy 2.4.29

если компилю на языке Си с помощью gcc -static print("Hello Worlt!!!\n") , то в puppy вываливается old kernel segnentation fault.

Почему такая большая разница? Т.е. паскалевская прога работает на 2.6.18 и 2.4.29, а на Си gcc работает только под 2.6.18, а на 2.4.29 ругается old kernel segmentation fault.

Что нужно знать и в чём разбираться для понимания причины такой разной работы компиляторов?

anonymous

>> Что нужно знать и в чём разбираться для понимания причины такой разной работы компиляторов?

>> gcc -static

Ты статически слинковал программу с glibc. Новые версии glibc не поддерживают работу со старыми ядрами. Программа на паскале скорее всего юзает родную glibc из puppy. Либо компилируй динамически, либо статически с другой реализацией libc (uclibc, klibc, можешь просто взять старую версию glibc).

Deleted
()
Ответ на: комментарий от Deleted

>Программа на паскале скорее всего юзает родную glibc из puppy.

Не факт, что программа на паскале юзает libc

anonymous
()
Ответ на: комментарий от anonymous

>> Не факт, что программа на паскале юзает libc

ivan@localhost ~/temp/pascal $ cat test.pas
program Test;
begin
        WriteLn('Hello!!!');
end.

ivan@localhost ~/temp/pascal $ fpc test.pas
Free Pascal Compiler version 2.2.0 [2008/03/26] for x86_64
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling test.pas
Linking test
5 lines compiled, 0.1 sec

ivan@localhost ~/temp/pascal $ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.4.0, stripped

ivan@localhost ~/temp/pascal $ ./test
Hello!!!

Действительно, у них там какие-то свои библиотеки для системных вызовов...

Deleted
()
Ответ на: комментарий от Deleted

Я правильно понимаю, что интерфейс системных вызовов ядер 2.4 и 2.6 одинаковый с точки зрения pascal?

Я правильно понимаю, что интерфейс системных вызовов ядер 2.4 и 2.6 одинаковый с точки зрения glibc разный?

anonymous
()
Ответ на: комментарий от Deleted

Я правильно понимаю, что интерфейс системных вызовов ядер 2.4 и 2.6 одинаковый с точки зрения pascal?

Я правильно понимаю, что интерфейс системных вызовов ядер 2.4 и 2.6 с точки зрения glibc разный?

anonymous
()
Ответ на: комментарий от anonymous

>> Я правильно понимаю, что интерфейс системных вызовов ядер 2.4 и 2.6 одинаковый с точки зрения pascal?

>> Я правильно понимаю, что интерфейс системных вызовов ядер 2.4 и 2.6 с точки зрения glibc разный?

Он разный с любой точки зрения.

Во-первых, в ядрах начиная с версии 2.5 вызовы ядра на x86/amd64 можно делать с помощью интсрукции sysenter вместо устаревшего int 0x80. int 0x80 оставлен для совместимости.

Во-вторых, ядро не стоит на месте и в него добавляются новые системные вызовы, которые "подхватываются" свежими версиями glibc. Смотри man 2 syscalls, там написано какие вызовы в какой версии ядра появились.

Из свежих версий glibc старый код постепенно выкидываются, поэтому новая glibc не будет работать со старым ядром.

Разница между ядрами 2.4 и 2.6 огромна, но они впринципе обратно совместимы (настолько, насколько это возможно). Поэтому код, написанный для 2.4 будет с большой вероятностью нормально работать на 2.6. Но код, заточенный под новые возможности 2.6 на 2.4 не заработает.

Стандартная библиотека из free pascal скорее всего в целях совместимости использует только вызовы ядра 2.4.

P.S. Я не специалист в этом,так что возможно где-то ошибаюсь.

Deleted
()
Ответ на: комментарий от Deleted

Спасибо. Постепенно всё встаёт на свои места... в моей голове :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.