Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
zoolog117
Заблокирован
#1

Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? - C++

24.10.2014, 01:49. Просмотров 1119. Ответов 6
Метки нет (Все метки)

Объясню подробнее, о чем я.

Пишем простой код на си, без всяких платформо- и компиляторозависимых функций
C
1
2
3
4
5
6
7
8
#include <stdio.h>
//#include <conio.h>
int main()
{
printf("hello world");
//_getch();
return 0;
}
Под виндой компилируем GCC/G++ в объектный файл, но не линкуем.
Под линуксом берем этот объектный файл и натравливаем на него линковщик от того же G++/GCC.
1) Что получаем в итоге? Слинкуется в линуксовый исполняемый файл? Будет работать?
2) А если наоборот, под линуксом объектный файл создать, а под виндой попытаться слинковать?
3) Если не прокатит с GCC/G++, то есть ли компилятор, с которым прокатит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2014, 01:49     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация?
Посмотрите здесь:
Научить bjam стирать объектные файлы Boost C++
C++ Как скомпоновать объектные файлы в Code Blocks?
C++ Даны две строки. Если они начинаются с одинаковых символов, то напечатать "ДА", иначе - "НЕТ"
C++ Что такое h -файл и obj-файл?Зачем они нужны?
Удалил все файлы obj из проекта C++ Builder
C++ Присвоить заданным переменным максимальное из их значений в случае, если они неравны, либо ноль, если равны
C++ Builder RAD Studio xe5 не может найти obj файлы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kekek
11 / 11 / 1
Регистрация: 24.12.2008
Сообщений: 54
24.10.2014, 15:16     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? #2
objdump -f hello.o
hello.o: file format elf64-x86-64-freebsd
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000
В заголовке объектника указывается архитектура, под которую был скомпилирован исходник. При компоновке проверяется соответствие этой архитектуры.

> x86_64-w64-mingw32-gcc -c hello.c
> objdump -f hello.o
objdump: hello.o: File format not recognized
> x86_64-w64-mingw32-objdump -f hello.o
hello.o: file format pe-x86-64
architecture: i386:x86-64, flags 0x00000039:
HAS_RELOC, HAS_DEBUG, HAS_SYMS, HAS_LOCALS
start address 0x0000000000000000
zoolog117
Заблокирован
24.10.2014, 15:20  [ТС]     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? #3
Kekek, это печально, но что с самим объектным кодом? Если одинаковый, то достаточно изменить заголовок.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
24.10.2014, 15:31     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? #4
В общем случае объектный код является платформо-зависимым. И вовсе не потому, что формат файла разный или заголовки другие. Я говорю чисто про код.

Если мы возьмём функцию, которая тупо берёт два параметра, складывает их и возвращает результат, то даже такой код может оказаться непереносимым. Из-за того, что на linux и на windows могут быть разные правила передачи параметров или настройки стека. Здесь я говорю не о факте, а о предположении. Но рано или поздно среди даже простых вещей можно нарваться на то, что действительно имеет разный способ представления на разных операционных системах.

То, что на linux'е и windows'е в общем случае разный набор библиотечных функций - тут более-менее очевидно, обсуждать даже не стоит.

На разных платформах могут иметь разную реализацию структуры данных, лезущие из библиотеки (типа struct stat, struct sigaction и т.п.), а потому обращение к одному полю при компиляции на linux выльется в обращение к другому полю при компиляции на windows

Добавлено через 1 минуту
Цитата Сообщение от zoolog117 Посмотреть сообщение
Пишем простой код на си, без всяких платформо- и компиляторозависимых функций
Для того в системе и есть файл stdio.h, чтобы платформо-зависимые вещи были реализованы внутри него, а снаружи использовался лишь платформо-независимы интерфейс.

Добавлено через 5 минут
Вот, например, пример, в котором с виду всё просто и независимо:

C
#include <signal.h>
 
struct sigaction S;
 
void func (void)
{
  S.sa_flags = 0;
}
Компилируем его одним и тем же приказом на sparc-linux и sparc-solaris:

Код
# sparc-linux
$ gcc t.c -O2 -S
$ cat t.s
...
func:
        sethi   %hi(S+132), %g1
        jmp     %o7+8
         st     %g0, [%g1+%lo(S+132)]
...
Код
# sparc-solaris
$ gcc t.c -O2 -S
$ cat t.s
...
func:
        sethi   %hi(S), %g1
        retl
        st      %g0, [%g1+%lo(S)]
...
Видим, что на одной операционной системе смещение до поля sa_flags в структуре равно 132 байта, а на другой - 0
Kekek
11 / 11 / 1
Регистрация: 24.12.2008
Сообщений: 54
24.10.2014, 15:35     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? #5
> x86_64-w64-mingw32-objdump -S hello.o
Код
hello.o:     file format pe-x86-64


Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 20             sub    $0x20,%rsp
   8:   e8 00 00 00 00          callq  d <main+0xd>
   d:   48 8d 0d 00 00 00 00    lea    0x0(%rip),%rcx        # 14 <main+0x14>
  14:   e8 00 00 00 00          callq  19 <main+0x19>
  19:   b8 00 00 00 00          mov    $0x0,%eax
  1e:   48 83 c4 20             add    $0x20,%rsp
  22:   5d                      pop    %rbp
  23:   c3                      retq
  24:   90                      nop
  25:   90                      nop
  26:   90                      nop
  27:   90                      nop
  28:   90                      nop
  29:   90                      nop
  2a:   90                      nop
  2b:   90                      nop
  2c:   90                      nop
  2d:   90                      nop
  2e:   90                      nop
  2f:   90                      nop
> objdump -S hello.o
Код
hello.o:     file format elf64-x86-64-freebsd

Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   bf 00 00 00 00          mov    $0x0,%edi
   9:   b8 00 00 00 00          mov    $0x0,%eax
   e:   e8 00 00 00 00          callq  13 <main+0x13>
  13:   b8 00 00 00 00          mov    $0x0,%eax
  18:   c9                      leaveq
  19:   c3                      retq
Скомпилировано разными версиями gcc. Под win64 версия 4.2.1, а под freebsd64 - версия 4.8.2, возможно поэтому так сильно отличается код.

Но главное отличие в том, что callq вызывает подпрограммы по разным адресам.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
24.10.2014, 15:55     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? #6
Цитата Сообщение от Kekek Посмотреть сообщение
Но главное отличие в том, что callq вызывает подпрограммы по разным адресам
Нет. Это кажущееся явление из-за плохого дизассемблера из-под objdump'а для объектного файла. Можешь заметить, что смещение в "main+0x19" и "main+0x13" в точности совпадает со смещением инструкции, следующей за call'ом

Но вот в чём реально есть разница - в первом объектнике есть call ещё какой-то функции. Какой конкретно - узнаешь по приказу "readelf --relocs hello.o" (имена вызываемых функции в дизассемблере, полученном objdump'ом, не отображаются). Но, думаю, жто различие будет присутсвовать только в функции main. Там вызов какой-нибудь фигни под именем __main или что-то типа того
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2014, 23:15     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация?
Еще ссылки по теме:
C++ как overload ++OBJ и --OBJ
C++ Обработка символьных данных. Yes, если есть символ в строке и NO если его нет
C++ Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет
Бесплатные кроссплатформенные компиляторы c++
Вывести решения уравнения, если их число конечно, "NO", если решений нет, и "INF", если их бесконечно много C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
24.10.2014, 23:15     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? #7
Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация?
На оба вопроса, ответ нет.
С++ не кроссплатформенный в плане объектных и исполняемых файлов, только на уровне кода и то только кода который рассчитан на портирование.

Добавлено через 1 минуту
Цитата Сообщение от zoolog117 Посмотреть сообщение
Kekek, это печально,
Пиши на Java, ну или на каких нибудь скриптовых языках.
Yandex
Объявления
24.10.2014, 23:15     Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru