LINUX.ORG.RU

C++ перенос скомпилированного приложения

 ,


0

1

Добрый день. Прошу объяснить мне, начинающему, почему элементарный хеловорлд откомпиленный в 32х битной системе, я не могу запустить в 64х битной. Вывод uname -m на моей машине выдает i686, на машине на которой пытаюсь запустить x86_64. Вывод ldd на моей машине

	linux-gate.so.1 =>  (0xb7784000)
	libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb767e000)
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74cf000)
	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7488000)
	/lib/ld-linux.so.2 (0xb7785000)
	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb746b000)
, а на другой «statically linked», но при попытке запуска «Segmentation fault (core dumped)»

А Вы представляете себе, что происходит при вызове функции в 32-х и 64-х битных системах? Как это связано с данными на стэке? Представьте...

anonymous ()
Ответ на: комментарий от kraew2006

Нет, это не Windows, где для этого создана специальная прослойка WoW64 (Windows 32-bit on Windows 64-bit).

Что за дистрибутив? Multilib имеется? Можно линк на сорцы/32-битный бинарь?

EXL ★★★★★ ()
Ответ на: комментарий от EXL

специальная прослойка WoW64 (Windows 32-bit on Windows 64-bit).

Эта прослойка не только либы, а ещё куча дополнительных костылей...

DarkEld3r ★★★★★ ()
Ответ на: комментарий от kraew2006

А разве в 64битных системах не присутствуют 32битные библиотеки для совместимости?

Могут присутствовать в зависимости от дистрибутива. В убунте с какой-то версии, вроде, выкинули.

DarkEld3r ★★★★★ ()
Ответ на: комментарий от EXL

Можно линк на 32-битный бинарь?

тут один шутник однострочник презентовал как-то...

dib2 ★★★★★ ()
Ответ на: комментарий от EXL

Тот же хелловорлд скомпилил под х64.

file ./test64
./test64: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=551d787b983cecf62b2da2823b844e7bfcbd232a, not stripped
Но не запускается.
./test
-bash: ./test: cannot execute binary file: Exec format error
И теперь я вообще запутался. Пните меня в любую возможную сторону проблемы

kraew2006 ()
Ответ на: комментарий от kraew2006

А я уже давно заметил, что мультилиб в линукс мягко говоря гемморный и не продуманный. Даже в винде проблем практически нет с этим, в маке так вообще одна .so/exe содержит и 32 и 64 битный код - запускай её где хочешь, везде будет работать.

menangen ★★★★★ ()
Ответ на: комментарий от menangen

я надеюсь это же не значит что нужно несколько осей ставить в дуалбут или на виртуалку)) но я пока не могу вкурить почему даже откомпиленное под х64 не хочет работать.

kraew2006 ()
Ответ на: комментарий от kraew2006

Ну, сейчас уже на x86 практически никто не сидит, тестируют софт только на x64, пакеты в основном собирают под x64, тот же Docker пашет только на x64 системах... Короче, на x86 тупо забили.

menangen ★★★★★ ()
Последнее исправление: menangen (всего исправлений: 1)
Ответ на: комментарий от kraew2006

У меня всё на 64 запускается.

exl@exl-virtual-machine:~ > uname -a
Linux exl-virtual-machine 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:43:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
exl@exl-virtual-machine:~ > file untitled5 
untitled5: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xd02626a1e175281ccacf1dfa9625ee8c628b9d4a, not stripped
exl@exl-virtual-machine:~ > ./untitled5 
Дарова!

Дистр - Linux Mint 16 KDE. Ищи проблему в дистрибутиве.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Без дополнительных плясок? Я так понимаю на виртуалке livecd? у меня даже ldd внятно ничего не выдает. А подскажите тогда как понять чего не хватает в системе?

kraew2006 ()
$ readelf -l untitled5 | grep interpreter
      [Requesting program interpreter: /lib/ld-linux.so.2]

Есть на целевой машине загрузчик?

AptGet ★★★ ()
Ответ на: комментарий от AptGet
readelf -l untitled5 | grep interpreter
readelf: Error: Section 27 has invalid sh_entsize of 1
readelf: Error: (Using the expected size of 4 for the rest of this dump)
readelf: Error: Section 29 has invalid sh_entsize of 1
readelf: Error: (Using the expected size of 8 for the rest of this dump)
readelf: Error: no .dynamic section in the dynamic segment
      [Requesting program interpreter: /lib/ld-linux.so.2]
kraew2006 ()
Ответ на: комментарий от kraew2006

Нет, вы не поняли. Вот этот файл /lib/ld-linux.so.2 должен быть в системе на которой вы свой бинарник запустить пытаетесь, именно по такому пути. Он вашу динамически связанную программу загружает.

AptGet ★★★ ()
Последнее исправление: AptGet (всего исправлений: 1)
Ответ на: комментарий от AptGet
$ ls -a /lib/  | grep ld-linux
ld-linux.so.2

я все понял, это вывод с целевой машины (на которой приложение падает). и предыдущий комент тоже.

kraew2006 ()
Ответ на: комментарий от AptGet
$ LD_DEBUG=all ./untitled5 
      9094:	
      9094:	Initial object scopes
      9094:	object=./untitled5 [0]
      9094:	 scope 0: ./untitled5
      9094:	
      9094:	object=linux-gate.so.1 [0]
      9094:	 scope 0: ./untitled5
      9094:	 scope 1: linux-gate.so.1
      9094:	
      9094:	
      9094:	relocation processing: ./untitled5 (lazy)
Segmentation fault (core dumped)
kraew2006 ()
Ответ на: комментарий от AptGet

А еще я не упомянул, что система крутится у недорогого простенького хостера. Может ли быть это ограничением, или багом изза виртуализации?

kraew2006 ()

linux-gate.so.1 => вроде kernel должен грузить ...

kdev ()
Ответ на: комментарий от kraew2006

Очевидно у тебя какая-то каша на бинарном уровне. Другие (не тобой скомпиленые) бинари работают? Уверен, что файл без повреждений копируется?

nanoolinux ★★★★ ()
Ответ на: комментарий от nanoolinux

Из репов норм работают. Да даже из исходников собирал, не помню правда уже что, через make && make install, и работает. Надо попробовать собрать еще гдето, не на своей машине, и запустить там. А скидую по фтп, да и хеши вроде совпадают.

kraew2006 ()
Ответ на: комментарий от kraew2006

А еще я не упомянул, что система крутится у недорогого простенького хостера. Может ли быть это ограничением, или багом изза виртуализации?

Нет, вряд ли, скорее древние бинутилс. Сейчас проверил на Centos 5 - бинарь работает. Какая версия бинутилс? readelf -v

AptGet ★★★ ()

Так если коре дампед, может корку открыть да посмотреть, что упало и где? Если б дело в мультилибе было, то оно бы не запускалось просто, нет?

roof ★★ ()
Ответ на: комментарий от roof

Короче я пересоздал сервер на debian6(x64) и под ней стартует без траблов. На старом скомпиленное с -g пробовал запустить в отладчике пишет:«not in executable format: File format not recognized» (как будто битый бинарь, только вот md5sum дает правильный хэш). Вот уж от убунты не ожидал таких подстав. Проблема решена не так как надо конечно, но тема закрыта. Сори за бесполезно потраченное время.

kraew2006 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.