Знатокам Linux

aleks777

Возникла следующая проблема:
Из дистрибутива RH5.2 были взяты
egcs-2.90.29 980515
И файлы
libstdc++.a
libstdc++.so.2.8.0
libc.a
libc.so
libm.so
ld-linux.so.2
crtbegin.o
crtn.o
crti.o
crtend.o


Делаю
[somewhere gg]$ ./usr/bin/g++ aaa.c -c -o aaa.o
-I ./usr/include/ -I ./usr/include/g++/
-I ./usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3/include/
Затем
/usr/bin/ld -o aaa -rpath /home//gg/lib/ \
-m elf_i386 -dynamic-linker /home//gg/lib/ld-linux.so.2 \
/home//gg/usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3/crtbegin.o \
aaa.o \
/home//gg/usr/lib/crt1.o \
/home//gg/usr/lib/crti.o \
/home//gg/usr/lib/crtn.o \
/home//gg/usr/lib/libstdc++.a \
/home//gg/usr/lib/libstdc++.so \
/home//gg/usr/lib/libc.a \
/home//gg/usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3/crtend.o
[somewhere gg]$ ldd ./aaa
libstdc++.so.2.8 => /home//gg/usr/lib//libstdc++.so.2.8 (0x4000b000)
libm.so.6 => /home//gg/lib//libm.so.6 (0x4004c000)
libc.so.6 => /home//gg/lib//libc.so.6 (0x40065000)
/home//gg/lib/ld-linux.so.2 => /home//gg/lib/ld-linux.so.2 (0x40000000)
И имею в итоге:
Program received signal SIGSEGV, Segmentation fault.
0x08062eb7 in __getopt_clean_environment at getopt_init.c:66


Что это может означать?
Что дает ошибку в библиотеке?

duantusova

Не понятно, что требуется. Если требуется получить статическую прогу, зачем тогда libstdc++.so. В этом случае нужно делать так:


#!/bin/sh
#installed packages in prefix
#
# egcs-1.0.3a-14.i386.rpm
# egcs-c++-1.0.3a-14.i386.rpm
# glibc-2.0.7-29.i386.rpm
# glibc-devel-2.0.7-29.i386.rpm
# binutils-2.9.1.0.15-1.i386.rpm
PREFIX=/home/user/tmp_dir
PATH=$PREFIX/bin:$PREFIX/usr/bin:$PREFIX/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29
LD_LIBRARY_PATH=$PREFIX/usr/lib
./usr/bin/g++ -nostdinc -nostdinc++ aaa.cc -c -o aaa.o -I ./usr/include\
-I ./usr/include/g++ \
-I ./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/include
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/ld -o aaa \
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/crtbegin.o \
./aaa.o \
./usr/lib/crt1.o \
./usr/lib/crti.o \
./usr/lib/crtn.o \
./usr/lib/libstdc++.a \
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/libgcc.a \
./usr/lib/libc.a \
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/crtend.o


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


#!/bin/sh
#installed packages in prefix
#
# egcs-1.0.3a-14.i386.rpm
# egcs-c++-1.0.3a-14.i386.rpm
# glibc-2.0.7-29.i386.rpm
# glibc-devel-2.0.7-29.i386.rpm
# binutils-2.9.1.0.15-1.i386.rpm
PREFIX=/home/user/tmp_dir
PATH=$PREFIX/bin:$PREFIX/usr/bin:$PREFIX/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29
LD_LIBRARY_PATH=$PREFIX/usr/lib
./usr/bin/g++ -nostdinc -nostdinc++ aaa.cc -c -o aaa.o -I ./usr/include\
-I ./usr/include/g++ \
-I ./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/include
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/ld -o aaa \
-rpath $PREFIX/lib \
-m elf_i386 -dynamic-linker $PREFIX/lib/ld-linux.so.2 \
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/crtbegin.o \
./usr/lib/crt1.o \
./usr/lib/crti.o \
./usr/lib/crtn.o \
./aaa.o \
./usr/lib/libstdc++.so \
./lib/libc.so.6 \
./usr/lib/gcc-lib/i386-redhat-linux/egcs-2.90.29/crtend.o

aleks777

Я уже разобрался, но все равно спасибо.
Оставить комментарий
Имя или ник:
Комментарий: