2012-04-12 30 views
9

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.

+0

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? –

+0

@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

+0

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 –

Trả lời

9

Từ gcc linker docs,

-nostdlib

Không sử dụng các tập tin hệ thống khởi động tiêu chuẩn hoặc các thư viện khi liên kết. Không có tệp khởi động và chỉ các thư viện bạn chỉ định sẽ là được chuyển đến trình liên kết và các tùy chọn chỉ định liên kết của hệ thống thư viện, chẳng hạn như -static-libgcc hoặc -shared-libgcc.

Do đó sử dụng,

-nodefaultlibs

Không sử dụng các thư viện hệ thống tiêu chuẩn khi liên kết. Chỉ các thư viện bạn chỉ định sẽ được chuyển đến trình liên kết, các tùy chọn chỉ định liên kết của thư viện hệ thống, chẳng hạn như -static-libgcc hoặc -shared-libgcc, sẽ bị bỏ qua. Các tệp khởi động chuẩn được sử dụng bình thường, trừ khi -nostartfiles được sử dụng. Trình biên dịch có thể tạo ra các cuộc gọi đến memcmp, memset, memcpy và memmove. Các mục này thường được giải quyết bởi các mục trong libc. Những điểm vào này nên được cung cấp thông qua một số cơ chế khác khi tùy chọn này được chỉ định.

Cũng thử,

g++ -Wl, -static 

-Wl  passes the next command on to the linker 
-static On systems that support dynamic linking, this prevents linking with 
     the shared libraries. On other systems, this option has no effect. 
+0

Điều này đã giúp rất nhiều, cảm ơn bạn. – Thomas

+0

Với -nodefaultlibs mã cho intialization tĩnh được bao gồm và gọi, nhưng sau đó tôi thấy không có cách nào để sử dụng mã .init/_start của riêng tôi. Điều đó vẫn còn có thể? – Thomas

+0

Bạn đã sử dụng '-nostartfiles' chưa? –

Các vấn đề liên quan