LINUX.ORG.RU

Совместимость различных версий Linux при запуске бинарных файлов


0

1

Добрый день! Не подскажете насчет совместимости различных версий Linux для следующей ситуации. Допустим, я пишу «Hello, world!» в старом RedHat, собираю g++ -o hello main.cpp. И потом запускаю ./hello на последней Ubuntu. Работать у меня не должно? В чем здесь проблема?


Как тогда поступают в таких ситуациях? Отправляют исходники и кто-то собирает бинарные файлы на той машине, на которой нужно будет запускать?

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

Столкнулась с этой проблемой. «Hello, world!», собранный на RedHat на Ubuntu выдает следующее: bash: ./hello: No such file or directory

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

Версия libc, не может найти соотв. версию ld.so.

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

вначале нужно файл программы исполнимым сделать командой «sudo chmod +x hello» после копирования на целевой компьютер.
И перед тем как начинать программировать нужно почитать хотя бы книжки по использования linux-основанных систем.

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

То есть задача стоит так,что у меня есть RedHat и последняя Ubuntu. И я хочу, чтобы то, что я собрала, по возможности, запускалось на большинстве версиях Linux.

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

Смотри в справке опции g++ -static*. Там их много.

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

понятно, что все права на исполнение есть.

Masha
() автор топика

Работать у тебя не должно, когда ты собираешь хело верлд на новой убунте и запускаешь на старом редхете

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

patchelf

Ух-ты, какая полезная тулза. Дякую

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

Командная строка компилятора будет примерно такой:

gcc hello.c -o hello -static

Тогда копия (не совсем, но по сути то же самое) glibc и всех остальных требуемых программой библиотек будет встроена в бинарник.

(К слову, glibc - это GNU'шная реализация libc, основной библиотеки Си.)

intelfx ★★★★★
()

вам для курсовика или зачем это?

Одна из главных концепций unix или nix-подобных систем: мобильность т.е. возможность развернуть программу на любой платформе за счет ее компиляции на этой платформе, а не таскания везде бинарника - что нибудь, да и отвалится.

Из современных дистров, только gentoo поддерживает в основном данную концепцию.

Считается, что со временем и ростом вычислительных мощностей, компилирование будет занимать все меньше времени и затрат.

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

проприетарный блоб, например. дадут тебе исходник, ага, жди

к сожалению реальность такова, хотя реверс никто не отменял и на nix-платформах это сделать наверное проще.

swwwfactory ★★
()

RE: Совместимость различных версий Linux при запуске бинарных файлов

Её никто не гарантирует и соответственно если она и есть то это {чудо/удача/счастливая случайность} и не более того. Где она точно будет так это в тех дистрибутивах, которые используют один и тот же toolchain т.е. в принципе в {u/edu/ku/lu/myth/xu}buntu т.е. там где отличия только в „косметике“.

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

А почему не должно? Сейчас как раз такую ситуацию попробовала. Собираю на ubuntu

g++ -o test main_Balance_copy.cpp -lcurl -lrt -static
И запускаю на старом RedHat. Возникают проблемы. Собираю из тех же исходников на RedHat. Запускаю на ubuntu, все работает.

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

Вероятно, работало бы.

Для запуска и компиляции 32-битных приложений под 64-битным линуксом тебе еще нужно будет 32-битные библиотеки установить (lib32-gcc-libs, lib32-glibc, lib32-librt и, возможно, еще что-то).

Anon
()
Ответ на: комментарий от Anon
make
g++ -o test main_Balance_copy.cpp -lcurl -lrt -m32 -static
In file included from /usr/include/stdio.h:28:0,
                 from main_Balance_copy.cpp:1:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.

Masha
() автор топика
Ответ на: комментарий от swwwfactory

Из современных дистров, только gentoo поддерживает в основном данную концепцию.

Какую концепцию ? Разделяемых библиотек ?! Да ладно только Генту. Ничего подобного, давно все уже или пакуют devel-static отдельно, или не пакуют вовсе. В ALT, к примеру, лет 10 уж скоро.

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

Угадали!

А что же тут угадывать ? No such file or directory - это несовпадение архитектуры однозначно (при условии, что все права есть). Если не те библиотеки, на них бы и ругался.

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

в альте есть развитая концепция source-based дистрибутивов?

Везде ведь сплошная бинарщина - я не против альта и других дистрибутивов и вообще за линукс... Но зачем кактус и виндовые замашки? Это в общем спорный вопрос и риторически и дело вкуса в конце концов. Ведь выбор должен быть - не так ли?

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

Потому что при линковке результат вяжется на определенный ABI, который с высокой вероятностью раньше не существовал

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

в альте есть развитая концепция source-based дистрибутивов ?

Каким образом source-based является необходимым атрибутом в данном вопросе ?

Везде ведь сплошная бинарщина

Эта бинарщина кем-то собирается в репозитарий и там как-то всё делают. :-) А политикой дистрибутива может быть борьба с использованием статической сборки.

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

Возникают проблемы.

ldd test что показывает ? Я, вообще-то, не очень программист, но подозреваю, что "-static" не достаточно. Нужны ещё *.a и *.la файлы для библиотек, которые могут отсутствовать.

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

Эта бинарщина кем-то собирается в репозитарий

к чему такая забота о nix-пользователе - а ежели хочется самому собрать?

и там как-то всё делают. :-) А политикой дистрибутива может быть борьба с использованием статической сборки.

дело вкуса, меня иногда самого бесит вынужденная компиляция, но приходится лакомиться этим кактусом... )

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

а ежели хочется самому собрать ?

Берёшь, и собираешь. Лучше в стиле дистрибутива: rpm, значит rpm. Deb - значит deb. Просто зачем всё-то собирать ?

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

Берёшь, и собираешь. Лучше в стиле дистрибутива: rpm, значит rpm. Deb - значит deb. Просто зачем всё-то собирать ?

мало-ли зачем :)

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

Уверен, что таких нужных случаев по пальцам пересчитать. :-)

вот тут Вы абсолютно правы! :) Это оно самое.

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

ну что-то типа

#include <stdio.h>
#include <curl/curl.h>
#include <string>
#include <iostream>

static std::string buffer;

const char *request =
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
 xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
 xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">
	<soap:Body>
		...
	</soap:Body>
</soap:Envelope>";


size_t write_data(char *ptr, size_t size, size_t count, std::string *buffer)
{
	int result = 0;
  //проверяем буфер
  if (buffer != NULL)
  {
    //добавляем к буферу строки из data, в количестве nmemb
    buffer->append(ptr, size * count);
    //вычисляем объем принятых данных
    result = size * count;
  }
  //вовзращаем результат
  //printf("DATA: %s", (char*)ptr);
  //printf("DATA: %s", ptr);
  return result;
    //printf("DATA: %s", (char*)ptr);
    //return count*size;
}

int main(void)
{
  CURL *curl;
  CURLcode res;
struct curl_slist *headerlist=NULL;


headerlist = curl_slist_append(headerlist, "Content-Type:text/xml");
  /* In windows, this will init the winsock stuff */
  curl_global_init(CURL_GLOBAL_ALL);

  /* get a curl handle */
  curl = curl_easy_init();
  if(curl) {
    /* First set the URL that is about to receive our POST. This URL can
       just as well be a https:// URL if that is what should receive the
       data. */
	    
    curl_easy_setopt(curl, CURLOPT_URL, "10.10.10.10:8081/Processing.asmx");
      //указываем прокси сервер
      curl_easy_setopt(curl, CURLOPT_PROXY, "10.10.10.1:8080");
	   curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "user:123456");
 curl_easy_setopt(curl, CURLOPT_USERPWD, "user2:Password2");
 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
std::cout << "Server response:"<<buffer << "\n";
    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  curl_global_cleanup();
  //curl_formfree(formpost);
  curl_slist_free_all (headerlist);
  return 0;
}

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

Ошибка у тебя:

g++ -m32 -lcurl curl.cpp -Wall -Werror
curl.cpp:9:1: ошибка: отсутствует завершающий символ " [-Werror]
curl.cpp:9:1: ошибка: отсутствует терминирующий символ "
curl.cpp:10:2: ошибка: в программе обнаружен непарный символ <<\>>
curl.cpp:10:13: ошибка: отсутствует завершающий символ " [-Werror]
curl.cpp:10:2: ошибка: отсутствует терминирующий символ "
curl.cpp:11:2: ошибка: в программе обнаружен непарный символ <<\>>
curl.cpp:11:14: ошибка: отсутствует завершающий символ " [-Werror]
curl.cpp:11:2: ошибка: отсутствует терминирующий символ "
curl.cpp:15:17: ошибка: отсутствует завершающий символ " [-Werror]
curl.cpp:15:1: ошибка: отсутствует терминирующий символ "
curl.cpp:10:2: ошибка: нет декларации <<xmlns>> в этой области видимости
curl.cpp:10:7: ошибка: expected <<,>> or <<;>> before <<:>> token
cc1plus: all warnings being treated as errors

В общем, ты явно что-то не доустановила.

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

нет,ему просто не нравится строка. Оставь вот так

 
const char *request =
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\";

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

дополнительную двойную кавычку в конце кто ставить за тебя будет? :)

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

Не знаю, у меня возникают проблемы,может что-то еще ставить нужно...

make -f Makefile_1 
g++ -o -m32 test main_Balance_copy.cpp -lcurl -lrt -static
/usr/bin/ld: unrecognised emulation mode: 32
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om elf_k1om
collect2: ld returned 1 exit status
make: *** [all] Error 1

make -f Makefile_1 
g++ -o -m32 test main_Balance_copy.cpp -lcurl -lrt -static
/usr/bin/ld: unrecognised emulation mode: 32
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om elf_k1om
collect2: ld returned 1 exit status
make: *** [all] Error 1
Masha
() автор топика
Ответ на: комментарий от Masha
make -f Makefile_1 
g++ -o test main_Balance_copy.cpp -lcurl -lrt -m32 -static
In file included from /usr/include/stdio.h:28:0,
                 from main_Balance_copy.cpp:1:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.
make: *** [all] Error 1
Masha
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.