Tôi đang làm việc trên một vỏ kim loại trần-M3 trong C++ cho vui và lợi nhuận.Làm thế nào để gỡ lỗi quá trình liên kết - GCC/ld - STL C++
Gần đây tôi quyết định thử và sử dụng thư viện STL khi tôi cần một số vùng chứa. Tôi nghĩ rằng chỉ đơn giản là cung cấp phân bổ của tôi nó sẽ không thêm nhiều mã vào nhị phân cuối cùng , vì bạn chỉ nhận được những gì bạn sử dụng. Tôi thực sự thậm chí không mong đợi bất kỳ quá trình liên kết nào cả với STL (cấp phát của tôi), vì tôi nghĩ đó là tất cả mã mẫu.
Tôi đang biên soạn bằng -fno-exception bằng cách này.
Thật không may, khoảng 600KB trở lên được thêm vào nhị phân của tôi. Tôi nhìn lên những biểu tượng được bao gồm trong nhị phân cuối cùng với nm và nó có vẻ là một trò đùa với tôi. Danh sách dài quá Tôi sẽ không thử và vượt qua nó. Mặc dù có một số biểu tượng yếu.
Tôi cũng nhìn trong file .map tạo ra bởi mối liên kết và tôi thậm chí tìm thấy những biểu tượng scanf
.text 0x000158bc 0x30 /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)¶
0x000158bc __sscanf¶
0x000158bc sscanf¶
0x000158bc _IO_sscanf¶
$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf
Làm thế nào tôi có thể gỡ lỗi này? Đầu tiên tôi muốn hiểu chính xác GCC đang sử dụng để liên kết (Tôi đang liên kết thông qua GCC). Tôi biết rằng nếu biểu tượng được tìm thấy trong một đoạn văn bản, thì toàn bộ phân đoạn được sử dụng, nhưng vẫn còn quá nhiều.
Bất kỳ đề xuất nào về cách giải quyết vấn đề này thực sự sẽ được đánh giá cao.
Cảm ơn, S.
Tôi đang sử dụng phiên bản gcc 4.6.3 từ Mã Sourcery. Tùy chọn -Wl, -v rất hữu ích. Dọc theo các lá cờ tôi đã chuyển đến liên kết, nó cũng bao gồm sau -lstdC++ -lm --start-group -lgcc -lgcc_eh -lc --end-group bây giờ tôi phải hiểu tại sao và cách xóa chúng. Đặc biệt là gcc_eh mà tôi giả sử là viết tắt của xử lý ngoại lệ. Bất kỳ đề xuất hoặc đọc về điều này? – emitrax
Nếu bạn liên kết với 'gcc' thay vì' g ++' thì nó sẽ không chuyển '-lstdC++' vào trình liên kết, và điều đó cũng có thể loại bỏ sự cần thiết của '-lgcc -lgcc_eh' (tôi không nhớ, tôi 'd phải kiểm tra) nhưng nếu bạn không sử dụng bất kỳ mã nào từ những libs đó thì không nên tăng kích thước thực thi - trình xử lý chấm dứt chi tiết trong libstdC++ có lẽ là những gì kéo vào mã không mong muốn –
Nếu tôi sử dụng gcc nó đã thắng Không tìm thấy _List_node_base :: _ M_hook symbol.Passing -lstdC++ bao gồm mọi thứ khác. Để thu hẹp sự cố, tôi đã thử liên kết trực tiếp với ld thêm từng cờ một. Nó thiếu __aeabi_unwind_cpp_pr0 trong libstdC++ a (list.o): (..._ List_node_base7_M_hookE) mà sau đó liên kết đến libc (memcpy và khác), sau đó liên kết mọi thứ khác. Đó là một chuỗi lớn và một PITA. Tôi chỉ muốn một cái hộp. :-) Tôi cũng nghĩ rằng, vì tôi có một đối tượng toàn cầu, nó cần __static_initialization_and_destruction_0 mà tôi không mong đợi. Cảm ơn bạn đã giúp đỡ. – emitrax