Biên dịch/liên kết với -nostdlib
dường như ngăn chặn khởi tạo tĩnh, ngay cả khi tôi thêm crti.s của riêng mình và crtn.s với các phần .init
/.fini
.g ++, khởi tạo tĩnh và -nostdlib
Có cách giải quyết nào để tạo g + + tạo mã khởi tạo tĩnh được chèn trong .init
hoặc tôi có thể gọi thủ công không?
Đây là những gì tôi đã cố gắng:
g++ -o test.o -c -fno-use-cxa-atexit test.cc # has _start (entry point)
# that calls _init and _main
as -o crti.o crti.s # has _init in section .init
as -o crtn.o crtn.s
g++ -o test ./crti.o test.o -nodefaultlibs -nostartfiles ./crtn.o
-nodefaultlibs
một mình bao gồm mã khởi tạo tĩnh và gọi điện thoại, nhưng các lực lượng sử dụng libc-_start/_init.
-nodefaultlibs -nostartfiles
cho phép tôi sử dụng _start/_init của riêng mình, nhưng không bao gồm mã hoặc gọi để khởi tạo tĩnh.
Hãy thử điều này 'g ++ -o test ./crti.o ./crtn.o test.o -Wl, -nodefaultlibs -nostartfiles' Và nhìn vào cách sử dụng của bạn tôi cảm thấy bạn chỉ muốn các tập tin khởi động của bạn được đưa vào và bạn có vẻ ổn với các thư viện khác từ thư viện chuẩn? –
@Pavan: Tôi đã thử '-Wl, -nodefaultlibs -Wl, -nostartfiles', nhưng sau đó libc-_init được trình biên dịch bao gồm. Việc sử dụng cho IBM Cell SPU - Tôi cần mã khởi động của riêng tôi để thiết lập mọi thứ và không sử dụng các hàm libc nhưng vẫn cần các hàm tạo tĩnh để được gọi. – Thomas
Tôi không thạo tiếng C++, vì vậy tôi không hiểu ý bạn là gì "nhưng vẫn cần các nhà xây dựng tĩnh để được gọi"? Bạn có thể cho tôi biết một số ví dụ không. Tôi đã suy nghĩ tĩnh libs tất cả thời gian –