gcc -nostdlib и mudflap - PullRequest
       1

gcc -nostdlib и mudflap

1 голос
/ 25 апреля 2011

Мне нужно запустить мою программу в другом дистрибутиве Linux, в котором не установлена ​​библиотека mudflap и установлена ​​другая версия glibc.Я пытался скомпилировать мою программу с помощью -static, но это невозможно:

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

Итак, я пытаюсь -nostdlib и присоединяю библиотеки вручную, но получаю следующие ошибки:

myuser@linux:~/Desktop$ gcc -nostdlib -Wl,-dynamic-linker,/home/myuser/Desktop/ld-linux-x86-64.so.2,-rpath,/home/myuser/Desktop /home/myuser/Desktop/libc.so.6 -fmudflap /home/myuser/Desktop/libmudflap.so.0 /home/myuser/Desktop/libdl.so.2 simple.c
myuser@linux:~/Desktop$ ./a.out
mf: dlsym("mmap") = NULL
Aborted (core dumped)
myuser@linux:~/Desktop$ ldd a.out
    linux-vdso.so.1 =>  (0x00007fff2bad2000)
    libc.so.6 => /home/myuser/Desktop/libc.so.6 (0x00007fddfd521000)
    libmudflap.so.0 => /home/myuser/Desktop/libmudflap.so.0 (0x00007fddfd175000)
    libdl.so.2 => /home/myuser/Desktop/libdl.so.2 (0x00007fddfcf70000)
    /home/myuser/Desktop/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fddfd884000)
myuser@linux:~/Desktop$
  1. Какой из них действительно используется?Тот, что на моем рабочем столе, или тот, что в / lib64?
  2. Какие еще флаги нужно включить, чтобы он правильно компилировался?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2011

Не так сложно.Используйте strace, чтобы узнать, с какими библиотеками связаны ваши двоичные файлы.

gcc -Xlinker -rpath = / путь / к / файлу / libs -Xlinker -I / путь / к / файлу / linker / ld-2.11.2.so -std = c99 -D_POSIX_C_SOURCE = 200112L -fmudflap /path/to/provided/mudflap/libmudflap.so.0 simple.c

0 голосов
/ 26 апреля 2011

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

Но никогда не носите libc, если вы связываете свою программу с более старой версией libc, вы должны быть в безопасности. Это означает, что вам нужно скомпилировать ваше приложение в среде, которая является либо более старой, либо точно такой же, как целевые системы.

Возможно, вам удастся избежать использования более новой системы, если вы не используете символы, которые получили обновленные версии между компиляцией и целевой системой.

Статическое связывание, к сожалению, намного сложнее, чем кажется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...