2011-10-09 24 views
11

Vị trí của chúng có được mã hóa cứng thành mã gcc hay gcc chỉ gọi as và chúng tôi phải có vị trí as trong biến PATH của chúng tôi?Gcc tìm kiếm như thế nào, ld và các tệp thực thi khác của binutils?

Và trong trường hợp thứ hai, làm thế nào chúng ta có thể tạo hai bộ công cụ gcc hoàn toàn riêng biệt? Ý tôi là, làm cách nào để chúng tôi có thể thực hiện gcc-A gọi as-Agcc-B gọi as-B nếu as-Aas-B đều được gọi là as?

Trả lời

10

Một số đường dẫn (ví dụ: cc1) được biên dịch. Một số khác (ví dụ: as) sử dụng tra cứu thông thường trong $ PATH. Điều này có thể khác nhau tùy thuộc vào các tùy chọn GCC được cấu hình với.

Bạn có thể nói khá dễ dàng bằng cách chạy với strace và grepping cho exec|stat.

$ strace -f gcc foo.c -o foo |& grep exec 
⋮ 
[pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", … 

Đó là lời kêu gọi cc1 bởi một con đường tổng hợp-in, như bạn có thể nhìn thấy từ thiếu tìm kiếm nó. Nó cũng không có trong $ PATH.

[pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory) 
[pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory) 
[pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0 

Đang tìm kiếm as trong $ PATH. Bạn có thể nói vì nó cố gắng mỗi vị trí trong $ PATH theo thứ tự.

Tôi đã bỏ qua rất nhiều đầu ra strace — ngay cả chỉ với stat và exec, dài một vài trang của nó.

Chạy gcc -v sẽ hiển thị cho bạn một số đường dẫn được biên dịch (như một phần của dòng cấu hình).

+0

Cảm ơn bạn rất nhiều. Bạn có biết tùy chọn cấu hình nào xác định hành vi cuối cùng không? Có cách nào để hạn chế gcc chỉ sử dụng/my/path/as và my/path/ld không? –

+1

@MichalisVichos: Có lẽ cờ cấu hình '--with-as =/my/path/as' sẽ làm điều đó. Xuất hiện tài liệu cấu hình có sẵn tại http://gcc.gnu.org/install/configure.html (hoặc tất nhiên với './configure --help') – derobert

1

Có một lựa chọn ad-hoc cho rằng: -B * prefix *, trích dẫn tài liệu gcc:

Đối với mỗi chương trình con được chạy, người lái xe trình biên dịch đầu tiên cố gắng tiền tố -B, nếu có. Nếu không tìm thấy tên đó hoặc nếu -B không được chỉ định, trình điều khiển sẽ thử hai tiền tố chuẩn, là/usr/lib/gcc/và/usr/local/lib/gcc /. [...]

1

Bạn cũng có thể truy vấn đường dẫn tìm kiếm GCC với:

gcc -print-search-dirs | grep -E '^programs' | tr ':' '\n' 

sản lượng mẫu:

programs 
=/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/ 

và một chương trình cụ thể với:

gcc -print-prog-name=cc1 

kết quả mẫu:

/usr/lib/gcc/x86_64-linux-gnu/6/cc1