![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Допустим я составляю программу:
Допустим теперь скомпилируем его на VS 2005. Ясно понятно, что получится PE файл, но вот вопрос: если я теперь отброшу PE заголовок, то получилу ли чистый кроссплатформенный код, который может быть выполнен под любой ОС? Скорее всего тут будет играть роль версия компиляции: debug || release? Это сообщение отредактировал(а) Rickert - 11.1.2008, 17:56 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Нет, тот же fprintf использует API той оси, под которую скомпилирована программа. Кроме того не всё зависит от оси, бывают еще и разные архитектуры процессоров -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Разные архитектуры процессоров не в счёт. Возьмём за аксиому.
Хорошо, а разве тажа fprintf никак не ретранслируется в машинный код? Она именно использует системные либы? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Rickert, fprintf входит в стандартную библиотеку Си. Т.е. если этот вызов не был соптимизирован компилятором (gcc иногда на fputs заменяет), то твоя прога будет ссылаться на эту библиотечную функцию.
Посмотри реализацию wine, думаю поймешь, почему нельзя. |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Хорошо, а если тело функции main будет состоять из asm кода и не будет использовать библиотек?
Это сообщение отредактировал(а) Rickert - 11.1.2008, 19:41 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Rickert, ты пытаешься решить какую то проблему, или ещё не прекратил отмечать новый год?
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
А как её можно ретранслировать в машинный код? В одном случае это будет запись в "экранный" буфер, во втором - отрисовка пикселей(в гр. режиме), в третьем запись в файл, причём, ФС может быть произвольной, устройство хранения может быть произвольным и т.д. В четвёртом случае, к примеру под *nix файлом может быть что угодно - от мышки, до сетевой платы. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Да, есть задача: написать клиент - сервер приложение. Сервер посылает пакет, который представляет собой машинные коды на выполнение, а клиент должен их принять и выполнить. Встал вопрос кроссплатформенности. archimed7592, я прекрасно понимаю твою мысль, но всё - таки: если писать на чистом ассемблере, ведь есть прерывания и номера функций, которые везде едины, ведь, процесор - то всё равно знает ограничнный набор команд, которые он и получает в независимости от ОС? Это сообщение отредактировал(а) Rickert - 11.1.2008, 21:50 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
используйте для этих целей другой язык __не__ транслирующий свою работу в бинарник. Например perl\lua\c#\java\php.. ну я думаю мысль понятна)
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
... или даже си/си++
но в этом случае передавать надо не машинные коды, а исходник, чтобы клиенты его компилировали. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 2 Всего: 7 |
мне придумался только 1 случай, когда не надо перекомпилировать код при переносе с машины на машину с разными OS -- использование интерпретатора
в наиболее используемых интерпретаторах есть все сетевые библиотеки. я, например, клиентские части, если они не требуют высокой скорости, пишу на перле, ранее на perl/Tk, сейчас на perl/Qt а универсальных С вызовов нет, например strlen в линуксе фактически вызывается из glibc. Можно даже не искать исходники, а просто посмотреть backtrace на разных системах для любых функций. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Пример таких, везде единых прерывания/портов можно? -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
В защищенном режиме все программные прерывания вызывают исключения, которые обрабатываются монитором защищенного режима (читай, ядром). Именно через них делаются так называемые "системные вызовы" - обращение программы к ядру системы. Такие обращения происходят при малейшем чихе программы, например, выделение памяти, открытие/закрытие файлов/сокетов и пр. Причем, у каждой ОС системные вызовы разные (я уж не говорю о том, что номера могут отличаться). Аппаратные прерывания и порты вообще прикладной программе недоступны, любое обращение к аппаратному порту приведет к исключению и убиванию программы ядром. Конечно, ты можешь написать на ассемблере код, который не обращается к ядру и все внутренние вызовы у него сделаны относительными (правда, нет у меня уверенности, что ОС позволит его выполнить, но это уже другой вопрос). Вот только какой смысл это делать? Разве "математику" (а это именно математика, так как все остальное системозависимо) нужно передавать в машинных кодах на другой комп? Если тебе так неймется, то либо воспользуйся готовыми скриптовыми языками (lua, perl, python и т.п.), либо создай свой узкозаточенный. Это сообщение отредактировал(а) bsa - 12.1.2008, 11:57 |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Всем спасибо!
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
fprintf - это функция libc через readelf находим ee смещение в libc*.so* и размер бинарные данные, находящиеся там, и есть машинный код если повезет, он будет даже позиционно-независимым
в общем случае не доступны в частном же через iopl() можно получить доступ к in/out инструкциям естественно, для этого процесс должен иметь CAP_SYS_RAWIO capability -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |