Gần đây tôi đã bắt đầu khám phá cách thư viện thời gian chạy C++ được sử dụng bởi mã được tạo ra.Biên dịch C++ dưới Linux mà không có thư viện thời gian chạy
Chủ yếu là tôi rất tò mò, nhưng tôi cũng muốn đánh giá số lượng công việc cần thiết để phát triển các công cụ cần thiết tối thiểu để khởi động hạt nhân trong C++.
Vì vậy, tôi bắt đầu triển khai thư viện thời gian chạy của riêng mình, nhưng tôi có một vấn đề nhỏ.
int main(int argc, char **argv)
{
return 0;
}
Biên dịch này với lệnh sau đây:
$ g ++ -ffreestanding -nostdlib -fno-BUILTIN -fno-rtti -fno-ngoại lệ -c main.cpp
Tôi nhận được cảnh báo này:
/usr/bin/ld: warning: không thể tìm thấy ký hiệu nhập _start; mặc định là 00000000080480b8
Sau đó, khi tôi cố thực thi nhị phân, tôi nhận được lỗi "Phân đoạn". Tôi đã cố gắng biên dịch "main.cpp" và tệp ASM.
[global _start]
[extern main]
_start:
call main
Liên kết tệp đối tượng theo cách thủ công với "ld", tôi không có cảnh báo nhưng nhị phân vẫn đang tăng "Lỗi phân đoạn".
Tôi cho rằng tôi đang thiếu thứ gì đó. Có lẽ một cái gì đó đã được thực hiện trước và sau khi cuộc gọi đến "chính" như thư viện hệ thống C hiện trong "__libc_start_main" ví dụ.
Ngoài ra, nếu ai đó có bất kỳ đề xuất nào về trang web, tài liệu hoặc sách về chủ đề này mà tôi nên đọc, tôi thực sự sẽ đánh giá cao nó.
Cảm ơn,
Patrick
[Cách xây dựng tệp thực thi Unix thiếu niên nhất] (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html) – QuantumMechanic
FYI, '_start' nằm trong CRT. –