Запустите исполняемый файл C в другом дистрибутиве - PullRequest
2 голосов
/ 15 ноября 2011

У меня есть программа на C, которую я разрабатываю с использованием Ubuntu 11.10 (ядро Linux версии 3.0.0-12-generic-pae). Мне нужно запустить эту программу в кластере, в котором установлен Debian 3.1 (Linux версия 2.4.24-om2) и используются процессоры Intel (R) Pentium (R) 4 с процессором 3.20 ГГц.

Проблема в том, что я не могу скомпилировать в кластере Debian, потому что там не установлена ​​библиотека GSL, которая нужна моей программе, и я не знаю, как установить ее (или использовать ее) без рута привилегии.

Если я попытаюсь запустить исполняемый файл, скомпилированный в Ubuntu (или простой hello world программой, для случая), он не будет работать, даже если я скомпилирую, используя все параметры gcc, которые бросает при выполнении на кластере:

gcc --save-temps -fverbose-asm hello_world.c -o hello_world

Когда я пытаюсь выполнить мою программу, скомпилированную в Ubuntu, она выдает:

floating point exception

Обновление: когда я компилирую, используя флаг -static, я получаю ошибку:

FATAL: kernel too old
Segmentation fault.

Так что я могу сделать что-то лучше, чем заново реализовать все функции GSL, которые я использую.

Ответы [ 5 ]

1 голос
/ 09 декабря 2012

Если ошибка

FATAL: ядро ​​слишком старое

Ошибка сегментации.

продолжается. проверьте версию ядра linux, запущенную на хост-компьютере, и версию поддержки, необходимую для исполняемого файла, созданного с помощью

ldd 'исполняемый файл'

1 голос
/ 15 ноября 2011

Если ваш код действительно работает и не умирает до вызова main (), было бы полезно поместить в ваш код некоторые отладочные выходные операторы, чтобы точно знать, где происходит сбой вашего кода.

Чтобы сделать ваш исполняемый файлнасколько это возможно, вы захотите сделать статическую связь.Таким образом, у него не будет много внешних зависимостей.Конечно, размер исполняемого файла немного увеличится.Если это все еще не работает, убедитесь, что архитектура, которую вы компилируете, такая же, как и у кластера.То есть на кластере работают 64-битные процессоры Intel?Или, может быть, это sparc или что-то еще?

Даже при статической компиляции вы не полностью переносимы.Вам повезет больше, если вы сможете выяснить, какая версия glibc работает в кластере, и построить свое приложение на этом.Вам будет еще безопаснее, если вы сможете создать свое приложение с той же версией gcc, что и в кластере.По сути, вы хотите, чтобы ваш набор инструментов был как можно ближе к кластерным системам.

ОБНОВЛЕНИЕ: Итак, ваша проблема почти наверняка - glibc, с которым вы компилируете, слишком нов, чтобы запустить ядро ​​2.4.Это не удивительно.Это можно исправить, выполнив то, что я сказал в предыдущем абзаце, но возможно сделать это только с помощью флагов компилятора.Я нашел этот вопрос , в котором говорится о опции --enable-kernel=VERSION для gcc.Однако у меня нулевой опыт использования этой опции.

1 голос
/ 15 ноября 2011

Я понятия не имею, что не работает , это то, что вы сталкиваетесь, но единственное, что я могу думать об этом, это не связано с кросс-компиляцией, это добавление -static к вашему gcc строка.

0 голосов
/ 16 ноября 2011

В конце я решил собрать библиотеку GSL без прав root.Я распаковал исходники в папке в домашнем каталоге, создал каталог _build и запустил ../configure, а затем сделал.

Я скопировал файлы каталога .libs, который был создан внутри _build, вновый каталог ~ / path / lib и используется:

find -name "*.h" -type f -exec cp {} ~/path/include/gsl \;

Чтобы скопировать все файлы заголовков, сгенерированные в исходной папке GSL (несомненно, был лучший способ сделать это).

Затем я попытался установить переменные среды для gcc (C_INCLUDE_PATH, LIBRARY_PATH), но по какой-то причине я не смог их сохранить (использовал и экспортировал, пытался изменить их в файлах ~ / profile и ~ / .bash_profile).

Итак, я использовал параметры -I и -L gcc для связи двух папок.Так получилось.

0 голосов
/ 15 ноября 2011

В linux есть несколько проблем с переносимостью. Ядро ABI меняется, библиотеки и набор инструментов меняются от дистрибутива к дистрибутиву и от выпуска к выпуску.

Самый надежный подход - это скомпилировать ваш код в старой системе (или среде chroot, основанной на старой версии Linux), поскольку Linux обычно достаточно обратно совместим.

Также рекомендую прочитать статью Переносимые бинарные файлы Linux

...