Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение "чистого" кроссплатформенного, кода 
V
    Опции темы
Rickert
Дата 11.1.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Допустим я составляю программу:
Код

#include <stdio.h>
int main(int argc, char** argv)
{
  fprintf(stdout, "Hi\n");
  return 0;
}

Допустим теперь скомпилируем его на VS 2005. Ясно понятно, что получится PE файл, но вот вопрос: если я теперь отброшу PE заголовок, то получилу ли чистый кроссплатформенный код, который может быть выполнен под любой ОС?
Скорее всего тут будет играть роль версия компиляции: debug || release?

Это сообщение отредактировал(а) Rickert - 11.1.2008, 17:56


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
nickless
Дата 11.1.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Rickert @  11.1.2008,  15:38 Найти цитируемый пост)
если я теперь отброшу PE заголовок, то получилу ли чистый кроссплатформенный код, который может быть выполнен под любой ОС?

Нет, тот же fprintf использует API той оси, под которую скомпилирована программа. Кроме того не всё зависит от оси, бывают еще и разные архитектуры процессоров smile 


--------------------
user posted image

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
PM MAIL   Вверх
Rickert
Дата 11.1.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Разные архитектуры процессоров не в счёт. Возьмём за аксиому.
Хорошо, а разве тажа fprintf никак не  ретранслируется в машинный код? Она именно использует системные либы?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
bsa
Дата 11.1.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Rickert, fprintf входит в стандартную библиотеку Си. Т.е. если этот вызов не был соптимизирован компилятором (gcc иногда на fputs заменяет), то твоя прога будет ссылаться на эту библиотечную функцию.
Посмотри реализацию wine, думаю поймешь, почему нельзя.
PM   Вверх
Rickert
Дата 11.1.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Хорошо, а если тело функции main будет состоять из asm кода и не будет использовать библиотек?

Это сообщение отредактировал(а) Rickert - 11.1.2008, 19:41


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Mayk
Дата 11.1.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Rickert, ты пытаешься решить какую то проблему, или ещё не прекратил отмечать новый год?




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 11.1.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Rickert @  11.1.2008,  17:54 Найти цитируемый пост)
Хорошо, а разве тажа fprintf никак не  ретранслируется в машинный код?

А как её можно ретранслировать в машинный код? В одном случае это будет запись в "экранный" буфер, во втором - отрисовка пикселей(в гр. режиме), в третьем запись в файл, причём, ФС может быть произвольной, устройство хранения может быть произвольным и т.д. В четвёртом случае, к примеру под *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
PM Jabber   Вверх
Rickert
Дата 11.1.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Цитата(Mayk @  11.1.2008,  20:04 Найти цитируемый пост)
Rickert, ты пытаешься решить какую то проблему, или ещё не прекратил отмечать новый год?

Да, есть задача: написать клиент - сервер приложение. Сервер посылает пакет, который представляет собой машинные коды на выполнение, а клиент должен их принять и выполнить.
Встал вопрос кроссплатформенности.
archimed7592, я прекрасно понимаю твою мысль, но всё - таки: если писать на чистом ассемблере, ведь есть прерывания и номера функций, которые везде едины, ведь, процесор - то всё равно знает ограничнный набор команд, которые он и получает в независимости от ОС?

Это сообщение отредактировал(а) Rickert - 11.1.2008, 21:50


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
jonie
Дата 11.1.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



используйте для этих целей другой язык __не__ транслирующий свою работу в бинарник. Например perl\lua\c#\java\php.. ну я думаю мысль понятна)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Mayk
Дата 11.1.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



... или даже си/си++  
но в этом случае передавать надо не машинные коды, а исходник, чтобы клиенты его компилировали.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
vadiml
Дата 11.1.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



мне придумался только 1 случай, когда не надо перекомпилировать код при переносе с машины на машину с разными OS -- использование интерпретатора

в наиболее используемых интерпретаторах есть все сетевые библиотеки.

я, например, клиентские части, если они не требуют высокой скорости, пишу на перле, ранее на perl/Tk, сейчас на perl/Qt

а универсальных С вызовов нет, например strlen в линуксе фактически вызывается из glibc. Можно даже не искать исходники, а просто посмотреть backtrace на разных системах для любых функций.
PM MAIL Jabber   Вверх
archimed7592
Дата 12.1.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Rickert @  11.1.2008,  21:48 Найти цитируемый пост)
едь есть прерывания и номера функций, которые везде едины,

Пример таких, везде единых прерывания/портов можно?


--------------------
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
PM Jabber   Вверх
bsa
Дата 12.1.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Rickert @ 11.1.2008,  21:48)
если писать на чистом ассемблере, ведь есть прерывания и номера функций, которые везде едины, ведь, процесор - то всё равно знает ограничнный набор команд, которые он и получает в независимости от ОС?

В защищенном режиме все программные прерывания вызывают исключения, которые обрабатываются монитором защищенного режима (читай, ядром). Именно через них делаются так называемые "системные вызовы" - обращение программы к ядру системы. Такие обращения происходят при малейшем чихе программы, например, выделение памяти, открытие/закрытие файлов/сокетов и пр. Причем, у каждой ОС системные вызовы разные (я уж не говорю о том, что номера могут отличаться). Аппаратные прерывания и порты вообще прикладной программе недоступны, любое обращение к аппаратному порту приведет к исключению и убиванию программы ядром.
Конечно, ты можешь написать на ассемблере код, который не обращается к ядру и все внутренние вызовы у него сделаны относительными (правда, нет у меня уверенности, что ОС позволит его выполнить, но это уже другой вопрос). Вот только какой смысл это делать? Разве "математику" (а это именно математика, так как все остальное системозависимо) нужно передавать в машинных кодах на другой комп? Если тебе так неймется, то либо воспользуйся готовыми скриптовыми языками (lua, perl, python и т.п.), либо создай свой узкозаточенный.

Это сообщение отредактировал(а) bsa - 12.1.2008, 11:57
PM   Вверх
Rickert
Дата 12.1.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Всем спасибо! smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
MAKCim
Дата 12.1.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  11.1.2008,  21:44 Найти цитируемый пост)
А как её можно ретранслировать в машинный код?

fprintf - это функция libc
через readelf находим ee смещение в libc*.so* и размер
бинарные данные, находящиеся там, и есть машинный код
если повезет, он будет даже позиционно-независимым 
Цитата(bsa @  12.1.2008,  11:53 Найти цитируемый пост)
Аппаратные прерывания и порты вообще прикладной программе недоступны, любое обращение к аппаратному порту приведет к исключению и убиванию программы ядром.

в общем случае не доступны
в частном же через iopl() можно получить доступ к in/out инструкциям
естественно, для этого процесс должен иметь CAP_SYS_RAWIO capability


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.