вызов СИ функции из ассемблера в *NIX

Тема в разделе "WASM.BEGINNERS", создана пользователем stellaco, 29 дек 2008.

  1. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Как-то у SUN это получается
    JRE, например, переносима. Качаешь бинарники и ниче не компилишь
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    K10
    1. солидарен с osrootd: от бинарников не требуется переносимость - это твоё, родное, подогнанное под тебя, твою систему и твой процессор. Вообще, хорошим тоном (в *nix, конечно) считатется распространение исходников, с последующей их сборкой пользователем, пусть даже он не программист, но ./configure и make может любой сделать. Если пользователь не полный нуб, то он соберет прогу так как ему надо: с нужными опциями, чтобы было то, что нужно и не было того, чего не нужно.
    2. При компиляции кода из поста #9, в бинарниках скорее всего не появятся системных вызовов. Бинарник будет вызывать libc. Поэтому некоторая переносимость (в пределах x86-32) у бинарника будет, но не 100%.
    3. Даже если бинарник использует системные вызовы, то и в этом случае будет некоторая переносимость, но хуже, чем в п. 2.
    4. Большинство программ на оф. сайтах предоставляют доступ к скомпилированным бинарникам со стандартным набором опций итп. Так же во всяких убунтах apt-get тоже вроде бы качает уже готовые бинарники. Но это не по-дзенски ;)
    Вывод: нахер бинарники, они "меняются", а исходники "остаются".
    Так и должно быть!
     
  3. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Хотел именно так сказать, но испугался холивара
     
  4. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Вот по моему вопросу:

    если на си есть:

    void (*some_void)();

    somevoid=someproc;

    как это на ассемблере написать?
     
  5. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    osrootd
    Код (Text):
    1. mov eax,someproc
    2. mov dword [somevoid],eax
    3. ...
    4. call dword [somevoid]
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    meduza
    А если программа платная и закрытая?
    Ну, знаю по собственному опыту, что "./configure и make" обычно выливается в несколько десятков/сотен ошибок компиляции, то нужных пакетов нет, то ядро собрано с какими-то другими опциями.
    Вот здесь хотелось бы поподробнее, неужели там и системные вызовы не стандартизованы?
    Спорить не буду, процент использования ОСей с таким подходом говорит сам за себя...
     
  7. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Спасибо Meduza!

    Код (Text):
    1. ; Простейший пример вызова функции из библиотеки ( создание плагина )
    2. section .text
    3.  
    4. extern printf
    5. extern exit
    6. extern dlopen
    7. extern dlsym
    8. extern dlerror
    9.  
    10. proc db 'myvoid',0
    11. md db "./libmyplugin.so"
    12. somev dw
    13.  
    14. error_msg db "",0
    15.  
    16. global main
    17.  
    18. main:
    19.     push $101
    20.     push md
    21.     call dlopen
    22.     pop edx
    23.     pop edx
    24.  
    25.     push proc
    26.     push eax
    27.     call dlsym
    28.     pop edx
    29.     pop edx
    30.     call eax
    31.     call dlerror
    32.     push  eax
    33.     call printf
    34.     pop eax
    35.     call exit
     
  8. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Пишите под Windows, это тоже не плохая система. Ecть РОSIХ Пopт пoд нee.
    Знaчит oпытa мaлoвaтo
    А что ты хотел? Представь, что тебе надо писать прогу по РАЗНЫЕ ядра.
    А где-то sizeof (long) меньше. Или вместо ssize_t int используют.
     
  9. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    K10
    "Стандартизированы", по большей части (кавычки обязательны, т.к. официального стандарта нет и не будет, в каждом ядре может быть реализовано по-разному). Уже была такая тема, я и другие там уже отвечали.
    п.с. K10, забудь про переносимость бинарников, это еретические мысли, их нужно уничтожать. Еще, ты смешиваешь понятия "распространение" бинарников (что вполне нормально, см. п.4 поста #22 - для тех случаев когда нужно по быстренькому установить какую-то прогу - зашел на сайт, нашел подходящий "готовый" бинарник, скачал, установил или тем же apt-get, который все сделает сам) и "переносимость" бинарников, когда ты хочешь сделать 1 бинарник, но так чтобы работало везде - дохлый номер, поверь.
     
  10. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    да и на одних syscalls далеко не уедешь.
    Не, например, такого вызова, который бы подключал к твоей проге shared object, а это значит, что кроме низкоуровневых операций (читать/писать/etc...) тебе более ничего не доступно, да и пойми, философия у нас не та. Мы изначально не хотим продавать свои проги, а зарабатываем на конкретных заказах.
     
  11. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    osrootd
    Было бы все так просто... Сервера по дефолту с юникс системами :dntknw:

    Поэтому и маловато.

    meduza
    Но мне нужна именно переносимая программа.

    Ну везде - т.е. хотя бы на FreeBSD x86-32 и желательно еще Linux. Но нужно чтобы закачал программу на сервер и она не пукая заработала, и не упала когда-нибудь в процессе работы из-за того, что на этой системе какой-то системный вызов проходит по другому чем на системе, где компилировалось...
     
  12. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    osrootd
    У меня тут есть мысль взаимодействующую с системой часть программы сделать исключительно на системных вызовах (на васме есть статья, где так сделан пример TCP сервера, мне в принципе боьшего не надо), а непосредственно логику делать в винде в виде системно-независимой статической (или м.б. динамической) библиотеки, которую потом прилинковывать.

    Ну мне от етого не легче, у меня ситуация такая, что нужен переносимый бинарник.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Поддерживаю K10 :)) может это конечно от полного отсутствия опыта в этой области, но я тоже хотел бы когда я наконец соберусь писать cgi на асме, то иметь минимум проблем с их совместимостью с разными хостингами (пхп и пр хи-... не предлагать :))
    ЗЫ: тоже не хочу холивара, но имхо nix рулит только на серверах и только потому, что win сервер имеет сумасшедше огромную цену, а ставить на публичный сервер варез как-то неоправданно рисковано ;)