Mình muốn cài một phần mềm trong thư mục của trung tâm siêu máy tính nhưng sudo, root, thậm chí apt-get, yum đều không dùng được... Phần mềm này yêu cầu glibc2.7 nên phải cài thủ công gcc và glibc (vì mình không thể thay đổi Đường dẫn của gcc tích hợp để tìm glibc).
gcc dường như đã được cài đặt thành công:
[geosign@node117 ~/binutils/bin]$ gcc -v
Sử dụng thông số kỹ thuật tích hợp.
Mục tiêu: x86_64-unknown-linux-gnu
Được định cấu hình với: /public/home/geosign/software/gcc/configure -prefix=/public/home/geosign/gcc --with-gmp=/public/home/geosign/Gcc --with- mpfr=/public/home /geosign/Gcc --with-mpc=/public/home/geosign/Gcc --with-ppl=/public/home/geosign/ppl --with-cloog=/public/home/geosign/ppl --enable-threads=posix CFLAGS=-I/public/home/geosign/ppl/lib:/public/home/geosign/Gcc/lib CPPFLAGS=-I /public/home/geosign/ppl/lib:/public/home/geosign/Gcc/lib CXXFLAGS=-I/public/home/geosign/ppl/lib:/public/home/geosign/Gcc/lib --enable-linguages=c,c++,fortran --disable-multilib
Mô hình luồng: posix gcc phiên bản 4.4.7 (GCC)
Tuy nhiên, khi tôi biên dịch glibc bằng cách sử dụng "make", nó hiển thị:
make[3]: Rời khỏi thư mục `/public/home/geosign/software/glibc/elf'
gcc -B/public/home/geosign/binutils/ -nostdlib -nostartfiles -r -o /public/home/geosign/software/build/glibc/elf/librtld.os '-Wl,-(' /public/home/ địa chỉ/phần mềm/xây dựng/glibc/elf/dl-allobjs.os /public/home/geosign/software/build/glibc/elf/rtld-libc.a -lgcc '-Wl,-)' \
-Wl,-Map,/public/home/geosign/software/build/glibc/elf/librtld.os.map
gcc -B/public/home/geosign/binutils/ -nostdlib -nostartfiles -shared \
-Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs -Wl,--verbose 2>&1 \
LC_ALL=C\
sed -e '/^===========/,/^===========/!d;/^===========/d' \
-e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
> /public/home/geosign/software/build/glibc/elf/ld.so.lds
gcc -B/public/home/geosign/binutils/ -nostdlib -nostartfiles -shared -o /public/home/geosign/software/build/glibc/elf/ld.so \
-Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs \
/public/home/geosign/software/build/glibc/elf/librtld.os -Wl,--version-script=/public/home/geosign/software/build/glibc/ld.map \
-Wl,-soname=ld-linux-x86-64.so.2 -T /public/home/geosign/software/build/glibc/elf/ld.so.lds
/public/home/geosign/software/build/glibc/elf/librtld.os: Trong hàm `_dl_start_final':
/public/home/geosign/software/glibc/elf/rtld.c:290: tham chiếu không xác định đến `_begin'
/public/home/geosign/binutils/bin/ld: /public/home/geosign/software/build/glibc/elf/librtld.os: relocation R_X86_64_PC32 đối với biểu tượng ẩn không xác định `_begin' không thể được sử dụng khi tạo một đối tượng dùng chung
/public/home/geosign/binutils/bin/ld: liên kết cuối cùng không thành công: Giá trị sai
coll2: ld trả về 1 trạng thái thoát
make[2]: *** [/public/home/geosign/software/build/glibc/elf/ld.so] Lỗi 1
make[2]: Rời khỏi thư mục `/public/home/geosign/software/glibc/elf'
make[1]: *** [elf/subdir_lib] Lỗi 2
make[1]: Rời khỏi thư mục `/public/home/geosign/software/glibc'
make: *** [all] Error 2
Những câu trong Makefile của elf là:
$(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
@rm -f $@.lds
$(LINK.o) -nostdlib -nostartfiles -shared $(z-now-$(bind-now)) \
$(LDFLAGS-rtld) -Wl,-z,defs -Wl,--verbose 2>&1 \
LC_ALL=C\
sed -e '/^===========/,/^===========/!d;/^===========/d' \
-e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
> $@.lds
$(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
$(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now)) \
$(filter-out $(map-file),$^) $(load-map-file) \
-Wl,-soname=$(rtld-installed-name) -T $@.lds
rm -f $@.lds
readelf -s $@ \
| awk '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "ĐĂNG KÝ") { print p=1 } END { exit p != 0 } '
Đây là cách tôi định cấu hình glibc:
/public/home/geosign/software/glibc/configure --prefix=/public/home/geosign/glibc --with-binutils=/public/home/geosign/binutils/ --enable-shared --disable-multilib
ldd ld hiển thị:
[geosign@node117 ~/binutils/bin]$ ldd ld
linux-vdso.so.1 => (0x00007fff163be000)
libz.so.1 => /lib64/libz.so.1 (0x0000003fd1400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003fd0400000)
/lib64/ld-linux-x86-64.so.2 (0x0000003fd0000000)
Cảm ơn bạn rất nhiều. Thời gian của tôi thực sự có hạn và tôi phải mất nhiều ngày.
Câu hỏi ngay lập tức của bạn là:
gcc -nostdlib -nostartfiles -shared -o -mcmodel=large \
/public/home/geosign/software/glibc-2.7/w/elf/ld.so ...
Điều này báo cho GCC tạo một tệp có tên -mcmodel=lớn
tệp đầu ra thay vì tệp đầu ra dự kiến /public/home/geosign/software/glibc-2.7/w/elf/ld .so
.
Bạn chưa cho chúng tôi biết cách bạn định cấu hình bản dựng GLIBC này nhưng tôi nghi ngờ bạn ./cấu hình
ở đâu đó trong cuộc gọi sử dụng -mcmodel=lớn
. đừng làm thế,không có lý doĐược sử dụng khi xây dựng glibc -mcmodel=lớn
.
Tôi là một lập trình viên xuất sắc, rất giỏi!