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

C++

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

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

24.10.2014, 01:49. Просмотров 1253. Ответов 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++, то есть ли компилятор, с которым прокатит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2014, 01:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация? (C++):

Если нет защиты от случайно пролитой жидкости как защитить ноутбук? - Ремонт ноутбуков
к примеру если у ноутбука нет защиты от случайно пролитой жидкости!как защитить ноут от этого?может существуют специальные лаки которым...

MySQL Какие файлы с собой таскать, если на клиенте нет Дельфи и нет MySQL? - Delphi БД
Добрый день! Подскажите какие файлы мне надо с собой таскать, если на клиенте нет ни делфи ни программ для работы с mysql? желательно...

Даны числа a, b, c. Если все они равны нулю, вывести об этом сообщение, если среди чисел нет нулей, найти и вывести их произведение, в противном случа - Basic
Всем привет. Будьте добры, подсобите в написании программки: &quot;Даны числа a, b, c. Если все они равны нулю, вывести об этом сообщение,...

Объектные файлы и библиотеки - C (СИ)
Доброго времени суток. Хотелось бы узнать несколько вещей: 1. Есть ли разница между объектником и статической библиотекой, сделанной...

Зачем текстовые файлы, если они являются частным случаем двоичных? - Информатика
&quot;Зачем были созданы текстовые файлы, если они являются частным случаем двоичных файлов?&quot; - такой вопрос мне задал препод при сдаче...

Как быть, если востановил файлы прогой Recuva, а они не работают - Восстановление данных
Что делать в такой ситуации?

6
Kekek
11 / 11 / 1
Регистрация: 24.12.2008
Сообщений: 54
24.10.2014, 15:16 #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
1
zoolog117
Заблокирован
24.10.2014, 15:20  [ТС] #3
Kekek, это печально, но что с самим объектным кодом? Если одинаковый, то достаточно изменить заголовок.
0
Evg
Эксперт CАвтор FAQ
18035 / 6267 / 428
Регистрация: 30.03.2009
Сообщений: 17,238
Записей в блоге: 28
24.10.2014, 15:31 #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
0
Kekek
11 / 11 / 1
Регистрация: 24.12.2008
Сообщений: 54
24.10.2014, 15:35 #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 вызывает подпрограммы по разным адресам.
0
Evg
Эксперт CАвтор FAQ
18035 / 6267 / 428
Регистрация: 30.03.2009
Сообщений: 17,238
Записей в блоге: 28
24.10.2014, 15:55 #6
Цитата Сообщение от Kekek Посмотреть сообщение
Но главное отличие в том, что callq вызывает подпрограммы по разным адресам
Нет. Это кажущееся явление из-за плохого дизассемблера из-под objdump'а для объектного файла. Можешь заметить, что смещение в "main+0x19" и "main+0x13" в точности совпадает со смещением инструкции, следующей за call'ом

Но вот в чём реально есть разница - в первом объектнике есть call ещё какой-то функции. Какой конкретно - узнаешь по приказу "readelf --relocs hello.o" (имена вызываемых функции в дизассемблере, полученном objdump'ом, не отображаются). Но, думаю, жто различие будет присутсвовать только в функции main. Там вызов какой-нибудь фигни под именем __main или что-то типа того
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
24.10.2014, 23:15 #7
Объектные файлы *.obj, *.o - они случайно не кроссплатформенные? Если нет, то реальна ли конвертация?
На оба вопроса, ответ нет.
С++ не кроссплатформенный в плане объектных и исполняемых файлов, только на уровне кода и то только кода который рассчитан на портирование.

Добавлено через 1 минуту
Цитата Сообщение от zoolog117 Посмотреть сообщение
Kekek, это печально,
Пиши на Java, ну или на каких нибудь скриптовых языках.
0
24.10.2014, 23:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2014, 23:15
Привет! Вот еще темы с ответами:

Научить bjam стирать объектные файлы - Boost C++
Вопрос возник вот как. Я собрался сегодня пересобрать буст и, зная на практике, сколь томительно ожидание, задумался о способах ускорить...

Как скомпоновать объектные файлы в Code Blocks? - C++
Здравствуйте. Я - новичёк в С++, самообучаюсь по книжке &quot;Как программироватьс на C++&quot;, автор Х.М. Дейтел. Поэтому, не пинайте,...

Не работает clean — все объектные файлы остаются в папке - C Linux
Доброго времени суток. Необходима помощь по построению makefile под гнушный мейк. Пока возникли проблемы 1)Выходная программа не хочет...

Даны три точки. Определить, будут ли они расположены на одной прямой. Если нет, то вычислить угол - MS Excel
Даны три точки А(х1, у1);В(х2, у2);С(х3, у3). Определить, будут ли они расположены на одной прямой. Если нет, то вычислить угол САВ.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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