Thật đáng ngạc nhiên là gcc không hỗ trợ nguyên bản này vì mã rõ ràng có sẵn trong nguồn trong thư mục có tên soft-fp
. Có thể biên dịch thư viện đó theo cách thủ công:
$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc
$ cd libgcc/soft-fp/
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c
$ ar -crv libsoft-fp.a *.o
Có một vài tệp không biên dịch do lỗi nhưng phần lớn sẽ biên dịch. Sau khi sao chép libsoft-fp.a
vào thư mục với các file nguồn của chúng tôi bây giờ họ biên dịch tốt với -msoft-float
:
$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L.
Một kiểm tra nhanh chóng sử dụng
$ objdump -D --disassembler-options=intel a.out | less
cho thấy như mong đợi không x87 hướng dẫn điểm nổi được gọi và chạy mã chậm hơn đáng kể, theo hệ số 8 trong ví dụ của tôi sử dụng nhiều phân chia.
Lưu ý: tôi sẽ đã ưa thích để biên dịch thư viện mềm-float với
$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c
nhưng có kết quả trong vô số thông báo lỗi như
adddf3.c: In function '__adddf3':
adddf3.c:46: error: unknown register name 'st(1)' in 'asm'
Có vẻ như phiên bản i386
là không được duy trì tốt như st(1)
điểm đến một trong các thanh ghi x87 rõ ràng là không có sẵn khi sử dụng -msoft-float
. Thật lạ hoặc may mắn phiên bản arm
biên dịch tốt trên i386
và có vẻ hoạt động tốt.
Cảm ơn bạn đã phản hồi. Tôi đã thử bootstrap uclibc bằng cách sử dụng buildroot nhưng nó có vẻ là bỏ qua các .config tôi cung cấp nó theo BR2_UCLIBC_CONFIG, ít nhất là cho các tùy chọn UCLIBC_HAS_FPU:/ – bdonlan
@Alex Liên kết toolchain uclibc bị hỏng. http://uclibc.org/toolchains.html phải phù hợp? – zengr