2012-10-07 21 views
7

Chuỗi công cụ của tôi là phiên bản mới nhất của arm-gcc.macro dòng lệnh lắp ghép cánh tay gnu không thành công với "Mã định danh không hợp lệ cho .ifdef"

Tôi có một đoạn mã trong tệp lắp ráp phải được bao gồm/lắp ráp có điều kiện.

.ifdef MACRO_FROM_CMDLINE 
Assembly instr1 
Assembly instr2 
.endif 

Mã đóng gói là một bổ sung gần đây.

Tôi đã thử cả hai:

gcc -x assembler-with-cpp --defsym MACRO_FROM_CMDLINE=1 <along with other necessary options> 

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 <along with other necessary options> 

Các -D kết quả trong "định danh hợp lệ cho .ifdef" và ".endif mà không .Nếu" lỗi.

Kết quả --defsym trong "MACRO_FROM_CMDLINE = 1: Không có tệp hoặc thư mục", "lỗi tùy chọn không xác định - lỗi".

Trả lời

11

Mã nhị phân gcc thúc đẩy quá trình biên dịch bằng cách gọi một số chương trình khác theo thứ tự thực sự thực hiện các giai đoạn khác nhau của công việc (biên dịch, lắp ráp, liên kết).

Khi bạn nói:

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ... 

bạn đang yêu cầu nó để chạy các nguồn thông qua tiền xử lý C, và sau đó chạy kết quả thông qua việc lắp ráp.

Bước tiền xử lý C sẽ biến:

.ifdef MACRO_FROM_CMDLINE 

thành:

.ifdef 1 

trước khi đi qua nó vào lắp ráp, mà sau đó không thể làm cho tinh thần của nó. Đây là lý do bạn gặp lỗi "số nhận dạng không hợp lệ". Nó cũng giải thích tại sao sử dụng tiền xử lý trước #ifdef khắc phục sự cố.


--defsym không hoạt động vì nó là một tùy chọn để lắp ráp, không phải là chương trình điều khiển gcc. (Người tài xế gcc không hiểu và đi qua một số tùy chọn để một số trong những chương trình đó gọi, nhưng không phải tất cả.)

Bạn thể Tuy nhiên, vượt qua tùy chọn tùy ý thông qua các lắp ráp bằng cách sử dụng

-Wa,option[,option...] 

cú pháp, thông báo cho trình điều khiển gcc chuyển các tùy chọn đó đến bộ lắp ráp (dưới dạng danh sách tùy chọn được phân cách bằng dấu cách).

Ví dụ:

gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ... 

thêm

--defsym MACRO_FROM_CMDLINE=1 

vào danh sách các tùy chọn truyền cho as khi gcc gọi nó, và đó là cách để làm cho ban công .ifdef ví dụ của bạn.


Bạn có thể xem các chương trình cá nhân gọi bởi gcc, và các tùy chọn nó thực sự đi với họ, bằng cách thêm tùy chọn -v.

Trong trường hợp này, bạn sẽ thấy một cái gì đó gọi là cc1 (thực tế GCC C biên dịch nhị phân) gọi với -E cờ (preprocess chỉ) để preprocess đầu vào vào một tập tin tạm thời, và sau đó as gọi vào tập tin tạm thời để lắp ráp nó.

+0

Tôi xác nhận rằng -Wa, các tùy chọn được mô tả bởi Mat ở trên hoạt động khá tốt. – Raj

1

Lạ, nhưng hóa ra tôi cần sử dụng cú pháp C trong tệp lắp ráp.

#ifdef MACRO 
    Assembly Instruction 
    Assembly Instruction 
#endif 

Và macro phải được chuyển bằng tùy chọn -D.

+0

GAS hỗ trợ cả afaik, Tại sao bạn không gọi trực tiếp cho GAS thay vì xem qua gcc trên các tệp lắp ráp của bạn? – sgupta

+0

Sử dụng gcc (và không phải GNU trực tiếp) có lợi ích khi gọi trình liên kết sau khi biên dịch trong khi sử dụng trực tiếp bạn cần thực hiện thêm bước liên kết sau đó, sử dụng ld. Sooo ... chỉ là một tiết kiệm thời gian 10 giây? – adam

+0

@sgupta: Sử dụng CPP là lựa chọn tốt nhất ở đây và 'trực tiếp * không * xử lý trước. (Nhưng '#' là ký tự nhận xét cho x86, do đó tệp có thể vẫn được tích hợp!) Sử dụng 'as' trực tiếp là lời khuyên xấu. Đặt tên tệp là 'foo.S' và tạo tệp bằng' gcc' + bất kỳ tùy chọn gcc nào, ví dụ: '-m32',' -c'. –

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