Có cách nào hiệu quả (có thể bằng cách lạm dụng bộ tiền xử lý gcc không?) Để có được một tập hợp các nguồn hạt nhân bị tước mã mà tất cả các mã không cần thiết theo .config bị bỏ?Dải nguồn hạt nhân Linux theo .config
Trả lời
Cũng có một số bước vào giải pháp.
Đầu tiên, người ta có thể có được các lệnh biên dịch được sử dụng bởi
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
Còn bây giờ, tôi chỉ chọn một dòng lệnh gcc cho các bước tiếp theo. Ví dụ xây dựng của kernel/kmod.c, nó trông giống như:
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
bây giờ tôi loại bỏ các tùy chọn -c
, -o ...
và thêm -E
, do đó vô hiệu hóa biên soạn và viết ra tiền xử lý với màn hình. Hơn nữa tôi thêm -fdirectives-only
để ngăn chặn việc mở rộng macro và -undef
để loại bỏ các định nghĩa macro được định nghĩa GNU. -nostdinc
để loại bỏ tiêu đề c tiêu chuẩn đã được thêm vào bởi makefile hạt nhân.
Hiện bao gồm vẫn được bao gồm và do đó được mở rộng trên đầu ra tiền xử lý. Vì vậy, tôi ống tập tin đầu vào thông qua grep loại bỏ chúng: grep -v '#include' kernel/kmod.c
. Bây giờ chỉ có một bao gồm còn lại: autoconf.h được bao gồm bởi dòng lệnh của Makefile. Điều này là tuyệt vời vì nó thực sự xác định các macro được sử dụng bởi #ifdef CONFIG_...
để chọn mã hạt nhân hoạt động.
Điều duy nhất còn lại là lọc ra các nhận xét tiền xử lý và số còn lại #define
s từ autoconf.h bằng phương tiện grep -v '^#'
.
Toàn bộ ống trông giống như:
grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#'
và kết quả là một phiên bản được lọc kernel/kmod.c chứa mã mà là thực sự xây dựng thành kmod.o.
Câu hỏi còn lại: Cách thực hiện điều đó cho toàn bộ cây nguồn? Có các tệp thực sự được xây dựng nhưng không bao giờ được sử dụng và bị loại bỏ khi liên kết không?
Biên dịch mọi thứ và sử dụng thời gian để tìm ra tệp nào không được sử dụng. Nó có thể không phải là rất chính xác nhưng nó có thể có giá trị một thử.
Điều này sẽ không hoạt động khi nhiều câu lệnh #ifdef ... được đánh giá bên trong tệp nguồn do đó các tệp không sử dụng và hầu như các tệp không sử dụng được biên dịch. – dronus
@dronus: Đó là cách đơn giản duy nhất mà tôi có thể nghĩ đến (Tiếp theo là, về cơ bản, viết hoặc sửa đổi bộ tiền xử lý C). Nó nên loại bỏ những thứ như mô-đun không sử dụng và vòm. Bạn có thực sự cần nó chính xác hơn không? Bạn đang cố gắng đạt được điều gì? –
Vâng, tôi chỉ muốn có được một số tổng quan đáng tin cậy về cách hoạt động của hạt nhân, nhưng gần như không thể đọc được hàng trăm MB mã. Vì vậy, tôi muốn xây dựng một hạt nhân tối thiểu và đọc mã được sử dụng thực sự của nó. – dronus