2015-02-24 16 views
7

chương trình của tôi biên dịch tốt mà không có -flto nhưng với -flto tôi nhận được lỗi này:Cách khắc phục lỗi liên kết "được xác định trong phần bị loại bỏ"?

% arm-none-eabi-g++ --version 
arm-none-eabi-g++ (4.8.3-9+11) 4.8.3 20140820 (release) 
Copyright (C) 2013 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

% arm-none-eabi-g++ -O2 -W -Wall -fPIE -flto -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -ffreestanding -nostdlib -std=gnu++11 -fno-exceptions -fno-rtti -c -o main.o main.cc 

% arm-none-eabi-g++ -fPIE -nostdlib -O2 -flto boot.o memcpy.o font.o main.o -lgcc -Tlink-arm-eabi.ld -o kernel.elf 
`memcpy' referenced in section `.text' of /tmp/ccYO5wE8.ltrans0.ltrans.o: defined in discarded section `.text' of memcpy.o (symbol from plugin) 
collect2: error: ld returned 1 exit status 

tôi đã cố gắng di chuyển memcpy.o vào các vị trí khác nhau để cố gắng đơn đặt hàng liên kết khác nhau nhưng lỗi luôn luôn là như nhau. Tôi đã thấy rằng đây là một vấn đề phổ biến nhưng không có câu trả lời cho câu hỏi trước được áp dụng. Tôi không có một bản cài đặt bị hỏng hoặc sử dụng các phiên bản biên dịch khác nhau để biên dịch. Tôi đang xây dựng một hạt nhân kim loại trần để không có bất kỳ thư viện bên ngoài nào khác ngoài libgcc.

Bất cứ ai cũng có ý tưởng về những gì đang diễn ra ở đó?

+0

lỗi tương tự xảy ra với g ++ - 4.9.2 –

Trả lời

6

Điều này có vẻ là lỗi trình biên dịch đã được sửa trong gcc-4.7 và được chuyển thành gcc-4.8 (gcc bugreport for 4.6, reapearance in 4.8). Giải pháp nhanh chóng là đánh dấu chức năng được sử dụng:

void * memcpy(void *dest, const void *src, sizte_t n) __attribute__((used)); 
void * memcpy(void *dest, const void *src, size_t n) { 
    uint8_t *d = (uint8_t *)dest; 
    uint8_t *s = (uint8_t *)src; 
    while(n--) { 
    *d++ = *s++; 
    } 
    return dest; 
} 

Điều đó sẽ dừng trình tối ưu hóa khỏi bỏ chức năng. Cảm ơn Richard Biener đã đề xuất điều đó.

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