Làm cách nào để cài đặt phiên bản GCC cụ thể trong Kali Linux?


8

Câu hỏi này dường như được giải quyết đúng đắn trong một số câu hỏi và những nơi khác dễ dàng tìm thấy với Google, nhưng tôi không tìm thấy giải pháp thỏa đáng vì những lý do được giải thích dưới đây. Nhưng chỉ để hoàn thành, tôi đã bao gồm một số liên kết có liên quan:

https://askubfox.com/questions/138284/how-to-downgrade-a-package-via-apt-get https://askubfox.com/questions/428772/how-to-install-specific-version-of -một số gói / 428778 https://askubfox.com/questions/26498/choose-gcc-and-g-version ...

Và những người khác.

Tuy nhiên, câu hỏi này liên quan đến việc cài đặt một phiên bản GCC rất cụ thể trong Kali Linux, phiên bản không có sẵn như là một gói cụ thể. Cụ thể, câu hỏi liên quan đến cách cài đặt phiên bản 6.3.0, vì tôi cần phiên bản này để biên dịch một chương trình cụ thể: https://www.reddit.com/r/Monero/comments/6d0ah8/xmrig_miner_new_release/

(như một câu hỏi bổ sung, nếu có cách khắc phục vấn đề cụ thể hơn mà không sử dụng phiên bản GCC khác, vui lòng trả lời, nhưng tôi tin rằng câu hỏi này là chung chung và tôi muốn biết cách thực hiện bất kể làm thế nào để tạo liên kết chương trình nói trên một cách chính xác)

Các phiên bản có sẵn để cài đặt bất kỳ gói nào, ví dụ gcc, có thể được xác định bằng:

apt-cache showpkg gcc

Mà sẽ liệt kê các phiên bản có sẵn trong "phiên bản:", vd

4:7.2.0-1d1
4:4.9.2-2

Cài đặt sau đó đơn giản như ban hành

apt-get install gcc:4:4.9.2-2

Điều này sẽ cài đặt phiên bản cũ hơn 4: 4.9.2-2, bằng cách đơn giản (tôi tin) ghi đè lên bản cài đặt 7.2.0-1d1, nếu có.

Để có sẵn phiên bản 4: 4.9.2-2, tôi phải thêm deb http://old.kali.org/kali sana main non-free contribvào /etc/apt/sources.listtệp của mình và sau đó chạy apt-get update.

Tuy nhiên, nếu phiên bản tôi cần không được liệt kê thì sao?

Tôi đã thử nghiệm nhiều nguồn khác nhau, ví dụ như các nguồn được tìm thấy ở đây: http://snapshot.debian.org/ và tại nhiều câu hỏi và trang web khác từ các tìm kiếm của Google.

Hầu hết trong số họ cho tôi bỏ qua hoặc lỗi, ví dụ như sau

Ign:3 http://snapshot.debian.org/archive/debian/20091004T111800Z lenny InRelease

Ngay cả khi điều này sẽ hoạt động, nó có vẻ là một cách tiếp cận rất tệ để cài đặt một phiên bản cụ thể, vì thêm một số nguồn tùy ý có thể không có phiên bản cụ thể mà tôi muốn.

Nếu tôi tìm kiếm trên snapshot.debian.org cho gcc, tôi chỉ nhận được các phiên bản rất cũ: http://snapshot.debian.org/package/gcc/

Cuối cùng tôi đã trở nên thất vọng với cách tiếp cận này và biên dịch GCC 6.3.0 từ tarball nguồn. Quá trình biên dịch đã thành công, nhưng sau đó tôi phải đối mặt với cách cài đặt nó. Tôi thận trọng về việc chạy make installnhư tôi sợ nó sẽ làm xáo trộn aptdpkgvà có thể phá vỡ hệ thống.

Thay vào đó, tôi đã cố gắng chạy nó từ thư mục build, trực tiếp. Tôi đã cố gắng chỉ đơn giản là thêm thư mục xây dựng như là mục đầu tiên trong PATH của tôi, nó không hoạt động. Sau đó, tôi đã cố gắng đổi tên /usr/bin/gccvà thực hiện một liên kết tượng trưng từ /usr/bin/gccnơi cuộc sống thực thi gcc-6.3.0 của tôi. Điều này trình bày vấn đề sau:

cc: error trying to exec 'cc1': execvp: No such file or directory, which

Điều này đã được sửa với một mục khác trong PATH của tôi.

Sau đó, tôi nhận được lỗi này:

/usr/include/stdio.h:34:21: fatal error: stddef.h: No such file or directory

Mà tôi giả sử là vì một mục bị thiếu trong /usr/lib/gcc/x86_64-linux-gnu. Tôi đã cố gắng tạo một liên kết tượng trưng từ 6 đến 6.3.0, nhưng điều này là không đủ. Tôi cũng đã cố gắng thực sự sao chép mọi thứ với cp -R, kết quả tương tự.

Đây phải là một chương trình 64 bit, nhưng tôi cũng coi như vậy cho /usr/lib/gcc/i686-linux-gnu.

Tôi chắc chắn rằng tôi có thể bắt đầu thực hiện straceđể xem nó cố gắng mở các tệp từ đâu, đọc tệp nhật ký, đọc nguồn và cuối cùng tôi tưởng tượng rằng tôi có thể tìm ra cách hack cùng một giải pháp được hình thành kém. Nhưng thật tuyệt nếu ai đó có thể cho tôi biết làm thế nào để làm điều này một cách lành mạnh.


Điều này không làm mất đi giá trị chung của câu hỏi của bạn; nhưng các bản phát hành hiện tại của XMRig sẽ xây dựng tốt với GCC 7, vì vậy bạn chỉ có thể xây dựng nó mà không làm phiền với GCC 6.3.
Stephen Kitt

Bạn luôn có thể biên dịch GCC (bất kỳ phiên bản không quá cũ) từ mã nguồn của nó , vì đây là phần mềm miễn phí. Hãy cẩn thận khi định cấu hình nó và xây dựng nó bên ngoài cây nguồn của nó.
Basile Starynkevitch

Câu trả lời:


10

Làm cách nào để cài đặt phiên bản GCC cụ thể trong Kali Linux?

GCC 6 có sẵn trên kali linux, nó có thể được cài đặt như sau:

apt install g++-6 gcc-6

Để chuyển đổi giữa gcc6 và gcc7

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1 --slave /usr/bin/g++ g++ /usr/bin/g++-7
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 2 --slave /usr/bin/g++ g++ /usr/bin/g++-6
update-alternatives --config gcc

đầu ra mẫu:

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-6   2         auto mode
  1            /usr/bin/gcc-6   2         manual mode
  2            /usr/bin/gcc-7   1         manual mode

Press <enter> to keep the current choice[*], or type selection number:

Chọn gccphiên bản mặc định của bạn .

vào ngày 2017-08-05 phiên bản gcc-6 được nâng cấp từ 6.3.0lên 6.4.0.

Cài đặt xmrigtheo hướng dẫn của bản dựng .

apt-get install git build-essential cmake libuv1-dev libmicrohttpd-dev
git clone https://github.com/xmrig/xmrig.git
cd xmrig
mkdir build
cd build
cmake ..
make

Xây dựng một phiên bản gcc cụ thể 6.3.0

Tải xuống tarball từ gương gần nhất : Phát hành GCC

wget https://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
tar xvf gcc-6.3.0.tar.gz
cd gcc-6.3.0
apt build-dep gcc
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-6.3.0/configure --prefix=/usr/bin/gcc-6.3 --enable-languages=c,c++,fortran,go --disable-multilib
make -j 8
make install

Thêm gcc-6.3vàoupdate-alternatives

Quan trọng : --disable-multilibTùy chọn được yêu cầu để cấu hình và xây dựng gcccho kiến ​​trúc hiện tại.

GCC WIKI: Cài đặt GCC


1
Xin lỗi, nhưng không cài đặt phiên bản GCC nào mà "gcc-6" cung cấp? Nếu tôi muốn cài đặt cụ thể 6.3.0 thì sao?
AlphaCentauri

@AlphaCentauri 6 tháng trước phiên bản gcc6 có sẵn 6.3.0, bây giờ phiên bản gcc6 được nâng cấp lên 6.4.0.
GAD3R

1
@AlphaCentauri trả lời cập nhật bao gồm các bước xây dựng.
GAD3R

1
  1. Trước tiên, bạn phải truy cập trang web này: http://gcc.gnu.org/mirrors.html
  2. Sau đó chọn bản phát hành cũ và bạn sẽ thấy các phiên bản khác nhau.
  3. Bây giờ bạn nên nhấp vào cái bạn muốn có và quá trình tải xuống sẽ bắt đầu.

  4. Cuối cùng, bạn phải biên dịch và cài đặt từ nguồn: https://askubfox.com/questions/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file


1
Cảm ơn, nhưng tôi không tin rằng bạn đã đọc toàn bộ câu hỏi của tôi. Tôi đã chỉ ra cách tôi đã cố gắng biên dịch từ nguồn. Vấn đề với điều này (như đã chỉ ra trong câu hỏi của tôi), đó là việc "thực hiện cài đặt" trên GCC có thể không phải là một ý tưởng hay vì nó có thể phá vỡ hệ thống. Hơn nữa, chỉ cần chạy GCC mà không thực hiện cài đặt sẽ đưa ra những thách thức của riêng nó, điều mà tôi cũng đã nêu ra trong câu hỏi ban đầu của mình.
AlphaCentauri

Bạn đã nêu trong câu hỏi của bạn rằng make installcó thể can thiệp vào dpkghoặc apt.. bạn có thể giải thích! @AlphaCentauri
Prashant Luhar

0

Nếu bạn đã thực hiện một tiêu chuẩn ./configure; makemà không chuyển bất kỳ tùy chọn nào configure, thì make installsẽ đặt các phần của phiên bản GCC mong muốn của bạn vào các thư mục con khác nhau của /usr/local.

Cây /usr/localthư mục dành cho phần mềm được quản trị viên hệ thống cài đặt bên ngoài hệ thống quản lý gói (tức là chính xác những gì bạn đang làm). Như vậy, phần mềm được cài đặt ở đó sẽ không phá vỡ phần mềm đóng gói trừ những trường hợp cực kỳ bất thường.

GCC nói riêng được thiết kế xung quanh giả định rằng bạn sẽ cài đặt nhiều phiên bản. Nó đòi hỏi khá nhiều các biện pháp tích cực từ phía bạn để phá vỡ mọi thứ (ví dụ: bằng cách trộn và ghép các mảnh để cố gắng tạo ra một phiên bản lai).


Bạn không nên (và có lẽ sẽ không thành công trong việc) xây dựng GCC trong cây nguồn của nó. Và bạn có thể muốn có thêm tùy chọn cho configuretập lệnh của nó (ví dụ: một số -program-suffix=vv)
Basile Starynkevitch

0

Cuối cùng tôi đã trở nên thất vọng với cách tiếp cận này và biên dịch GCC 6.3.0 từ tarball nguồn. Quá trình biên dịch đã thành công,

Trước tiên, tôi khuyên bạn, nếu bạn biên dịch GCC từ nguồn của nó, hãy chọn phiên bản mới hơn (ví dụ: GCC 7 vào cuối năm 2017).

Sau đó, hãy chắc chắn xây dựng GCC bên ngoài cây nguồn của nó và thử trước configuretập lệnh của nó với --helpvà để chuyển nhiều tùy chọn hơn cho nóconfigure . Đọc cẩn thận các cài đặt GCC hướng dẫn và hiểu vai trò của autoconf .

Trong thực tế, tôi khuyên bạn nên

  • chạy /usr/bin/gcc -vđể hiểu GCC hệ thống của bạn đã được cấu hình như thế nào

  • chạy apt-get build-dep gcc-6(hoặc tương tự) để có được các phụ thuộc GCC của hệ thống gần đây

  • tạo một thư mục xây dựng bên ngoài cây nguồn GCC của bạn và chạy thêm .../configure(thay thế ...bằng đường dẫn tương đối phù hợp, vd ../gcc-7.2/) và makeở đó.

  • bạn có thể muốn chuyển ít nhất --program-suffix=-mineđến điều đó configure( -minecó thể được thay thế bằng hậu tố khác) và thậm chí bạn có thể thêm --prefix=$HOME/soft/nếu bạn không có quyền truy cập root. Có thể bạn sẽ muốn tùy chọn bổ sung để configurevà bạn cần phải lựa chọn và cung cấp cho họ một cách cẩn thận.

  • sau đó make install(bạn thậm chí có thể chạy mà không cần root make install DESTDIR=/tmp/gccinst/và sau đó sao chép cẩn thận và đệ quy như root mà /tmp/gccinst/....) sẽ cài đặt mọi thứ trong /usr/local/bin/gcc-minevv .... (hoặc $HOME/soft/bin/gcc-mine....) vì vậy sẽ không phá vỡ bất kỳ tệp nào được cài đặt hệ thống .

Lưu ý rằng FHS yêu cầu hệ thống quản lý gói phải để yên /usr/local/(đó là mặc định --prefixcho GCC configure)


OP đã GCC 7, nhưng đang tìm kiếm 6.3.0 sau một bình luận reddit sai lầm.
Stephen Kitt

0

Bạn cũng có thể sử dụng một chuỗi công cụ được biên dịch sẵn hoặc cái này cho kiến trúc cụ thể của bạn (x86_64, glibc, gcc 6.3).

Tất nhiên tùy chọn tiếp theo là sử dụng cái gọi là rootfs-builder như buildroot hoặc yocto
để tạo ra một chuỗi công cụ với phiên bản gcc cụ thể của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.