Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Статическая линковка системных библиотек


Автор: Torsten 18.12.2008, 19:16
Интересует каким образом можно статически слинковать с приложением такие библиотеки, как :
* linux-gate (это кстати вообще что ? первый раз ее увидел в ldd, хотя в опциях компиляции ее нигде не указано)
* libm
* libc
* ld-linux

Автор: chaos 19.12.2008, 12:24
Код

chaos@penguin:~/Work/Arm/App/Test$ cat > test.c
#include <stdio.h>

int main()
{
    printf("Hello world!!!\n");
    return 0;
}
^Z
[1]+  Stopped                 cat > test.c

chaos@penguin:~/Work/Arm/App/Test$ gcc test.c 

chaos@penguin:~/Work/Arm/App/Test$ ./a.out 
Hello world!!!

chaos@penguin:~/Work/Arm/App/Test$ ldd a.out 
    linux-gate.so.1 =>  (0xb7f1b000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d8e000)
    /lib/ld-linux.so.2 (0xb7f01000)

chaos@penguin:~/Work/Arm/App/Test$ ls -l | grep a.out
-rwxr-xr-x 1 chaos chaos     9040 2008-12-19 14:25 a.out

chaos@penguin:~/Work/Arm/App/Test$ gcc test.c -static

chaos@penguin:~/Work/Arm/App/Test$ ldd a.out 
    not a dynamic executable

chaos@penguin:~/Work/Arm/App/Test$ ls -l | grep a.out
-rwxr-xr-x 1 chaos chaos   579275 2008-12-19 14:25 a.out

chaos@penguin:~/Work/Arm/App/Test$ ./a.out 
Hello world!!!

Автор: wertik 4.3.2009, 14:07
Наверное он имел в виду это:

root@nout /opt/test # gcc main.c -I/usr/include/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib -lssl -lcrypto
main.c: В функции 'main'
main.c:3: предупреждение: return type of 'main' is not 'int'

root@nout /opt/test # ldd a.out 
    linux-gate.so.1 =>  (0xffffe000)
    libmysqlclient.so.15 => /usr/lib/libmysqlclient.so.15 (0xb7e0c000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7df8000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7dc6000)
    libnsl.so.1 => /lib/libnsl.so.1 (0xb7dae000)
    libm.so.6 => /lib/libm.so.6 (0xb7d88000)
    libssl.so.0 => /usr/lib/libssl.so.0 (0xb7d47000)
    libcrypto.so.0 => /usr/lib/libcrypto.so.0 (0xb7c09000)
    libc.so.6 => /lib/libc.so.6 (0xb7abd000)
    /lib/ld-linux.so.2 (0xb7f70000)
    libdl.so.2 => /lib/libdl.so.2 (0xb7ab9000)
root@nout /opt/test # 



Автор: xvr 4.3.2009, 14:56
Цитата(Torsten @ 18.12.2008,  19:16)
Интересует каким образом можно статически слинковать с приложением такие библиотеки, как :
* linux-gate (это кстати вообще что ? первый раз ее увидел в ldd, хотя в опциях компиляции ее нигде не указано)
* libm
* libc
* ld-linux

Последнюю никак - это динамический линкер системы  smile (Он сам уберется при -static)


Автор: wertik 4.3.2009, 15:06
Вот так:

gcc main.c -lm -lc
main.c: В функции 'main'
main.c:2: предупреждение: return type of 'main' is not 'int'
root@nout /opt/test # ldd ./a.out       
    linux-gate.so.1 =>  (0xffffe000)
    libm.so.6 => /lib/libm.so.6 (0xb7ef3000)
    libc.so.6 => /lib/libc.so.6 (0xb7da7000)
    /lib/ld-linux.so.2 (0xb7f3a000)


Автор: xvr 4.3.2009, 15:21
Кста, нашел что такое linux-gate.so:
Цитата

From time to time this is a cause of befuddlement and frustration for users as they go searching for a non-existent system file. You can confidently tell users on this futile quest that there's not supposed to be a linux-gate.so.1 file present anywhere on the file system; it's a virtual DSO, a shared object exposed by the kernel at a fixed address in every process' memory

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)