LINUX.ORG.RU
ФорумTalks

[конкурс] just for fun

 


0

0


что всё флейм да флейм, уже который год одно и то-же. давайте как-то поменяем формат что ли? в конце-концов, наши руки не для скуки.

предлагаю небольшое соревнование на забавный код. что-то с одной стороны простенькое и не требующее существенного времени на реализацию aka чтобы можно было сделать за вечер под пивко, но в то-же время чтобы была какая-то интересная изюминка.

моя версия.

задача: написать программу, которая бы запускалась и делала что-то более-менее осознанное на заданном множестве операционных систем как "родная". пусть это будут Linux и пачка BSD как IMHO наиболее доступные к пониманию. возьмём скажем тройку Linux+FreeBSD+NetBSD. желающий в принципе могут дополнить. для определённости пусть она ожидает от пользователя ввода числа, считает от него число Фибоначчи и выводит результат.

пояснения: это не скрипт, не байткод под VM, это именно машинный код чистой воды. a.out или ELF по желанию. "как родная" означает, что для исполнения программы не требуется каких-либо эмуляторов сторонних OS a'la linux emul в *BSD и иже с ними. с точки зрения OS это должен быть обычный честный исполняемый.

// wbr

Ответ на: комментарий от Gharik

> Чего там было про когда коту делать нечего? Быть может проще это самое? ;)

хех. был бы я таким же гибким как тот кот - занимался бы всякой хернёй с копмутерами, линупсом и пр.?! ну а так, на безрыбье и рак щуку..

// wbr

klalafuda ★☆☆
() автор топика
Ответ на: комментарий от int_0dh

>>что если выводить число как код возврата а вводить через argv[] ? :) >>системных вызовов для ввода/вывода вообще не потребуется

Чтобы получить argv и выйти с кодом возврата тоже нужны системные вызовы. AFAIK даже просто "легально" завершить работу программы без системного вызова невозможно в принципе. Если ошибаюсь - поправьте.

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

> Чтобы получить argv и выйти с кодом возврата тоже нужны системные вызовы. AFAIK даже просто "легально" завершить работу программы без системного вызова невозможно в принципе. Если ошибаюсь - поправьте.

чтобы получить argv & K не нужны :) чтобы выйти - на вскидку не помню.

// wbr

klalafuda ★☆☆
() автор топика

Сразу видно человека близкого железу. :)

А идею не требующую ассемблера какую нить предложить никак ?

Я себе навскидку представляю какого обьема копания в потрохах потребует разный вызов сисколлов под разными системами на С. Линкер тоже забыли ? То что и там и там есть ELF вообще говоря не значит что компилеры в секции elf пихают одно и то же - там совершенно разное так как libc тоже разный.
А компилеры что одно и то же генерят ? Они ведь и всякие трамплины и прочую муть генерят, а не только "много много раз умножить", плюс модели памяти могут быть _чуток_ разные - адреса ядра и привязки не PIC кода в linux/bsd имхо разные. Это только что я навскидку помню.

То есть бросаем C и линкеры как кошмар - пишем на ассемблере , при чем удаляя все инициализирующее. Была статья "самая короткая программа на Линукс". Нам нужен самый конец где чистый асссемблер/бинарник, вся инициализация удалена и запуск по прямому входу.

Потом на ассемблере определение "на какой операционке работаем" и вызов процедур с разнам форматом сисколов в зависимости от.

Гхм....

kernel ★★☆
()

Может лучше какой нить ЛОР GPL софт предложить - какой нить небольшой и полезый ? Что бы люди к нему написали каждый свой кусок.

kernel ★★☆
()
Ответ на: комментарий от Gharik

> его там было про когда коту делать нечего? Быть может проще это самое? ;)

Ыменно. В свое время в Компьтере был конкурс на самую короткую программу. Победила программа длинной 0 (ноль) байтов. Это был исполняемый файл с расширением exe. Программа запускалась и ВЫДАВАЛА СООБЩЕНИЕ (об ошибке). :-P Авторы сделали оговорку, что возможно что и это не предел.

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

> В свое время в Компьтере был конкурс на самую короткую программу.

Что собственно показывает скорее уровень Компутерры . В прикладной CS подобные задачки полезная штука.
btw, Текущий рекорд Hellow World для линукс ИМХО 40 байт.

kernel ★★☆
()
Ответ на: комментарий от Beria1937

>> его там было про когда коту делать нечего? Быть может проще это самое? ;)

> Ыменно. В свое время в Компьтере был конкурс на самую короткую программу. Победила программа длинной 0 (ноль) байтов. Это был исполняемый файл с расширением exe. Программа запускалась и ВЫДАВАЛА СООБЩЕНИЕ (об ошибке). :-P Авторы сделали оговорку, что возможно что и это не предел.

вот что вы все такие умные и серьёзные, а? брови не жмут?

// wbr

klalafuda ★☆☆
() автор топика
Ответ на: комментарий от kernel

> А идею не требующую ассемблера какую нить предложить никак ?

hm. мне почему то всегда казалось, что человек, который осмелился называть себя программистом, by design не должен испытывать особых трудностей с ассемблером. хотя бы с одним. впрочем, может быть я конечно не прав.

> Я себе навскидку представляю какого обьема копания в потрохах потребует разный вызов сисколлов под разными системами на С.

весь объём на несколько десятков строк :)

нет, ну конечно же если начинать с чтения Таненбаума то да, объем работы можно заметно увеличить :)

> Линкер тоже забыли ? То что и там и там есть ELF вообще говоря не значит что компилеры в секции elf пихают одно и то же - там совершенно разное так как libc тоже разный.

линкер одинаков на указанных платформах :) опять же, поведение ld зависит лишь от заданного скрипта с настройками который, в свою очередь, можно нарисовать любым как душе заблагорассудится.

> А компилеры что одно и то же генерят? Они ведь и всякие трамплины и прочую муть генерят, а не только "много много раз умножить"

и компилятор - а конкретно gcc - в 99% случаев пихает туда одно и то-же и ему в общем то всё равно подо что собирать - под Linux или под BSD :)

> плюс модели памяти могут быть _чуток_ разные - адреса ядра и привязки не PIC кода в linux/bsd имхо разные. Это только что я навскидку помню.

и модель памяти у них то-же одинаковая :)

> То есть бросаем C и линкеры как кошмар

вы видимо спутали редактор связей aka linker и компилятор :)

> - пишем на ассемблере , при чем удаляя все инициализирующее.

чтобы убрать всё инициализирующее нет необходимости писать всё на ассемблере. с этим прекрасно справляется и штатный C.

> Была статья "самая короткая программа на Линукс". Нам нужен самый конец где чистый асссемблер/бинарник, вся инициализация удалена и запуск по прямому входу. Потом на ассемблере определение "на какой операционке работаем" и вызов процедур с разнам форматом сисколов в зависимости от.

да, где-то так.

впрочем, писать мультиплатформенный исполняемый из ELF действительно занятие не особо хитрое и вумное. интереснее сделать то-же самое, но для пары WinNT + Linux.

// wbr

klalafuda ★☆☆
() автор топика

Можно упростить задачу. Написать программу, которая будет выводить один и тот же текст, независимо от интерпретатора/компилятора. То есть должна получиться "кросс-языковая" программа. Единственное условие: на stdout должно выводиться одинаковая последовательность байт, ни больше, ни меньше.

Для примера:

cat /*dev/null; echo "Hello, LOR"\! cat <<c*/ /*dev/null | cat > /dev/null c */ () {} /* c */ main() { cat(); printf("Hello, LOR!\n"); } /* 17 format(' Hello, LOR!') write (6,17) stop end c*/

Прорамма выдаёт одно и тоже на 4 языках: C, Fortran, C Shell and Bourne Shell.

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

прощу прощения, вот правильное форматирование:

Можно упростить задачу. Написать программу, которая будет выводить один и тот же текст, независимо от интерпретатора/компилятора.
То есть должна получиться "кросс-языковая" программа. :)
Единственное условие: на stdout должно выводиться одинаковая последовательность байт, ни больше, ни меньше. 

Для примера:

cat /*dev/null; echo "Hello, LOR"\!
cat <<c*/ /*dev/null | cat > /dev/null
c */ () {} /*
c */ main() { cat(); printf("Hello, LOR!\n"); } /*
17      format('  Hello, LOR!')
        write (6,17)
        stop
        end
c*/

Прорамма выдаёт одно и тоже на 4 языках: C, Fortran, C Shell and Bourne Shell.

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

Извините за ламерство, но нельзя ли сделать для пары DOS + Linux?

В какие команды ассемблера превратится сигнатура эльфа, если его запускать в DOSе как .com и могут ли они быть обратимы?

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

> Извините за ламерство, но нельзя ли сделать для пары DOS + Linux?

сильно в этом сомневаюсь. разве что Linux начнёт понимать NE.

> В какие команды ассемблера превратится сигнатура эльфа, если его
запускать в DOSе как .com и могут ли они быть обратимы?

$ echo "int main() { return 0; }" >test.c
$ gcc -o test test.c
$ objdump -b binary -m i386 -M intel -D test | head -n 30

test:     file format binary

Disassembly of section .data:

00000000 <.data>:
       0:       7f 45                   jg     0x47
       2:       4c                      dec    esp
       3:       46                      inc    esi
       4:       01 01                   add    DWORD PTR [ecx],eax
       6:       01 00                   add    DWORD PTR [eax],eax
        ...
      10:       02 00                   add    al,BYTE PTR [eax]
      12:       03 00                   add    eax,DWORD PTR [eax]
      14:       01 00                   add    DWORD PTR [eax],eax
      16:       00 00                   add    BYTE PTR [eax],al
      18:       80 82 04 08 34 00 00    add    BYTE PTR [edx+0x340804],0x0
      1f:       00 00                   add    BYTE PTR [eax],al
      21:       07                      pop    es
      22:       00 00                   add    BYTE PTR [eax],al
      24:       00 00                   add    BYTE PTR [eax],al
      26:       00 00                   add    BYTE PTR [eax],al
      28:       34 00                   xor    al,0x0
      2a:       20 00                   and    BYTE PTR [eax],al
      2c:       07                      pop    es
      2d:       00 28                   add    BYTE PTR [eax],ch
      2f:       00 1c 00                add    BYTE PTR [eax+eax],bl
      32:       19 00                   sbb    DWORD PTR [eax],eax
      34:       06                      push   es
      35:       00 00                   add    BYTE PTR [eax],al

aka заголовок ELF представляет собой что-то мело вменяемое.
по крайней мере с точки зрения i386.

впрочем, с учётом того, первым идёт условный переход причём по
сравнительно вменяемому смещению, может быть и можно сообразить
что-то на эту тему - думать нужно.

// wbr

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

> То есть должна получиться "кросс-языковая" программа. :)

боже сохрани поиметь в наследство от пред. поколений в отладку такой код.. ;)

// wbr

klalafuda ★☆☆
() автор топика
Ответ на: комментарий от klalafuda

>hm. мне почему то всегда казалось, что человек, который осмелился
>называть себя программистом, by design не должен испытывать особых
>трудностей с ассемблером. хотя бы с одним. впрочем, может быть я
>конечно не прав.

Сколько из людей(в процентах) действительно занимающихся полезным программированием нужен для их деятельности знания ассемблер + низкоуровневые_интерфесы_ОС ? :) Я вот например вообще ассемблер более менее серьезно использовал во времена Бк0010 и потом DOS . На линуксе - НИКОГДА не был нужен. Я же не железячник :)

> весь объём на несколько десятков строк :)

Я про инфомацию потребную что бы этот код написать...

>нет, ну конечно же если начинать с чтения Таненбаума то да, объем
> работы можно заметно увеличить :)

Ну не так далеко, но: копаться в опциях линковки ld скриптах опциях компиляции для урезания всего и вся, искать доки о том что сейчас компилятор и линкер пихают в бинарь.... Теперь скажите честно - кто из _реальных_ программистов, это знает "прямо сейчас" а не после копания в манах. Мне кажется ИМХО это будут крайне интересные подвиды реальных программистов :)

>линкер одинаков на указанных платформах :) опять же, поведение ld
>зависит лишь от заданного скрипта с настройками который, в свою
>очередь, можно нарисовать любым как душе заблагорассудится.

Я в курсе что линкер один. Но ведь скрипты то разные. Тем более что меня BSD не особенно интересовала, если уж честно. :p

> и модель памяти у них то-же одинаковая :)

И адреса привязки для не-PIC кода тоже ? Точно ? :)

> вы видимо спутали редактор связей aka linker и компилятор :)

Я имел в виду "компилятор С" и линкер к нему.

>чтобы убрать всё инициализирующее нет необходимости писать всё на
>ассемблере. с этим прекрасно справляется и штатный C.

Вы думаете я невнимательно читал упомянутую мной статью ? Там все ключи указаны :)

PS

Вы там случайно не над вирусом работаете :) ?????

kernel ★★☆
()
Ответ на: комментарий от kernel

> Сколько из людей(в процентах) действительно занимающихся полезным программированием нужен для их деятельности знания ассемблер + низкоуровневые_интерфесы_ОС ? :) Я вот например вообще ассемблер более менее серьезно использовал во времена Бк0010 и потом DOS . На линуксе - НИКОГДА не был нужен. Я же не железячник :)

все очень просто. если "программист" не знает ассемблера [любого] то, с львиной долей вероятности можно быть уверенным, что он никогда не читал Кнута и не разбирался с MIX. ну и какой же он после этого программист? так, покурить вышел.

> Ну не так далеко, но: копаться в опциях линковки ld скриптах опциях компиляции для урезания всего и вся, искать доки о том что сейчас компилятор и линкер пихают в бинарь.... Теперь скажите честно - кто из _реальных_ программистов, это знает "прямо сейчас" а не после копания в манах. Мне кажется ИМХО это будут крайне интересные подвиды реальных программистов :)

блин, граждане, а что, сегодня поднять попу с дивана и нажать info ld - это уже считается западло и верх перенапряжения? ну должна же быть в голове хоть какая-то толика живой любознательности! иначе после этого приходят эдакие "линуксоиды" с пальцами шире косяка, которые на проверку оказываются просто ламерами :( "я знаю linux!". ага.

ps: это не личный выпад, это оценка подхода. ясен пень, что придётся почитать маны, подумать головой, посмотреть исходники, поработать руками и так по кругу. именно на *это* нацелен квест. а не на то, чтобы сделать очередную никому не нужную херовинку. это же не кодерство в конце-концов за булку хлеба, это just for fun. неужели народ перестал получать fun от того, что он узнает что-то новое :-?

> И адреса привязки для не-PIC кода тоже ? Точно ? :)

точно :) бо вся адресация очевидно косвенная aka jmp +10, jmp -10. по какому адресу загружен исполняемый в этой ситуации совершенно всё равно и это правильно. да и зачем нам какие-то адреса привязки? все проще :)

> Вы там случайно не над вирусом работаете :) ?????

под *NIX? а смысл? как раз эта радость пишется сравнительно просто, но зачем? опятьь же, очень сложно распространяться по голой пустыне, кочуя от оазиса к оазису между которыми сотни километров.

// wbr

klalafuda ★☆☆
() автор топика
Ответ на: комментарий от klalafuda

Ну у него речь шла о кроссплатформенном вирусе.

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

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

>> Вы там случайно не над вирусом работаете :) ????? >под *NIX? а смысл? как раз эта радость пишется сравнительно просто, но зачем? опятьь же, очень сложно распространяться по голой пустыне, кочуя от оазиса к оазису между которыми сотни километров. Так нет смысла или сложно?

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

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

google://how to make bootable openbsd cd.

а вообще-то они уже распространяют инсталябельные образы.

polachok
()

Вот: http://ifolder.ru/5271958 Версия скомпилированная под FreeBSD запускается везде, а скомпилированная под Линуксом, только под ним и запускается :(. Пока не разбирался, но думаю, что дело в компиляторе.

k_andy ★★★
()
Ответ на: комментарий от klalafuda


>> Вы там случайно не над вирусом работаете :) ?????
>под *NIX? а смысл? как раз эта радость пишется сравнительно просто, но
>зачем? опятьь же, очень сложно распространяться по голой пустыне, кочуя
>от оазиса к оазису между которыми сотни километров.

Ну серверные черви под винду прекрасно существавали и в таких условиях. Как и линуксовые кстати - был момент когда их стало больше обычного и мрачные предсказания казалось сбываются.

kernel ★★☆
()
Ответ на: комментарий от klalafuda

> точно :) бо вся адресация очевидно косвенная aka jmp +10, jmp -10. по
> какому адресу загружен исполняемый в этой ситуации совершенно всё
> равно и это правильно. да и зачем нам какие-то адреса привязки? все
> проще :)

Гхм. PIC код это он и есть - position independent, те с косвенной адресацией :) Когда я последний раз читал доки(давно) бинари были не PIC кодом в массе своей :)

>блин, граждане, а что, сегодня поднять попу с дивана и нажать info ld -
>это уже считается западло и верх перенапряжения? ну должна же быть в
>голове хоть какая-то толика живой любознательности!

Лаждно, ладно вы в чем то правы.:) Просто у меня при взгляде на ассемблер (интеловкий в особенности) болит голова и хочется смотреть на ченить менее брейфаковое


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