2012-03-26 20 views
5

ARM mikro denetleyici (SAM7) ve Yagarto toolchain kullanarak gömülü yazılım üzerinde çalışıyorum.gcc newlibc uygulamasının özel işlevlerini kullanmak için nasıl zorlayabilirim?

Kodumda şu anda bağlantılar libc.a. Ancak, kodumun zaten sahip olduğu yerleşik işlev memcpy özel bir uygulamasını kullanmak istiyorum.

ben GCC Manual belirtilen ancak bağlayıcı hala will aşağıdaki uyarı şikayet olarak -fno-yerleşik ve/veya -fno-yerleşik-memcpy kullanarak denedi:

contiki-crazy-horse.a(flashd_efc.o): In function `memcpy': 
C:\Users\Melvin\GitRepo\projects\Amatis_Project\SAM7_Contiki\examples\er-rest-example/../../cpu/arm//at91sam7s-x/./flashd_efc.c:669: multiple definition of `memcpy' 
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-memcpy.o):C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\string/../../../../../newlib-1.19.0/newlib/libc/string/memcpy.c:78: first defined here 
collect2: ld returned 1 exit status 
make: *** [rest-server-example-nosyms.crazy-horse] Error 1 
../../cpu/arm/at91sam7s-x/Makefile.at91sam7s-x:181: recipe for target `rest-server-example-nosyms.crazy-horse' failed 

doğru yolu nedir Belirli gcc yerleşik fonksiyonların özel uygulamalarını kullanmak için?

Düzenleme 1: Kullanmakta olduğunuz bağlantı komutunu ekleme. Aşağıdaki kodda Porject.a, tüm projenin nesne dosyaları ile oluşturulan bir arşiv dosyasıdır.

CC  = arm-none-eabi-gcc 
CFLAGSNO = -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) -I$(CONTIKI_CPU)/loader \ 
     -I$(CONTIKI_CPU)/dbg-io \ 
      -I$(CONTIKI)/platform/$(TARGET) \ 
      ${addprefix -I,$(APPDIRS)} \ 
      -DWITH_UIP -DWITH_ASCII -DMCK=$(MCK) \ 
      -Wall $(ARCH_FLAGS) -g -D SUBTARGET=$(SUBTARGET) 

CFLAGS += $(CFLAGSNO) -O -DRUN_AS_SYSTEM -DROM_RUN -ffunction-sections 

LDFLAGS += -L $(CONTIKI_CPU) --verbose -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map 

$(CC) $(LDFLAGS) $(CFLAGS) -nostartfiles -o project.elf -lc Project.a 
+0

Ayrıca bu hatayı üreten linker komut satırını da ekleyin. – Clifford

+0

@Clifford İstediğiniz bilgileri eklemek için orijinal gönderiyi düzenledim – maguirre

cevap

3

o libc.a içinde memcpy() buluyor, o zaman herhangi bir "yerleşik" ile çelişen değil, daha ziyade newlib uygulamasıyla. Ayrıca -nostdlibs seçeneğini belirtmeniz ve gerekirse libc.a ve libm.a'yı açıkça belirtmeniz gerekebilir.

Nesne (.o) dosyaları kütüphane arşivleri (.a) dosyalarından önce bağlanır, böylece bir simge bir nesne dosyası tarafından çözümlenirse, arşivlerde aranmaz. Geçersiz kılma kitaplığınızdaki geçersiz kılmaları yerleştirirseniz, standart kitaplık (veya standart kitaplığı kullanan diğer kitaplıklar) önündeki bağlayıcı komut satırında önünüzde listelersiniz.

[Eklendi]şu aslen bir "yorum" ama muhtemelen cevap olmalıdır; sorudaki "Düzenleme 1" e ve bağlantı siparişiyle ilgili olarak aşağıdaki yoruma yanıt olarak:

-nostartfiles -o project.elf -lc Project.a değerini -nostdlib -o project.elf -start-group Project.a -lc -end-group olarak değiştirin. -nostdlib anahtarı, hem başlangıç ​​dosyalarının (ör. -nostartfiles) ve standart kitaplıkların varsayılan bağlantısını devre dışı bırakır. Kitaplık gruplaması, gruptaki kitaplıkların, başka semboller çözülene kadar yinelemeli olarak aranmasına neden olur; böylece, sizinki gibi, sipariş dışı ve döngüsel bağımlılıkların çözülmesine izin verilir. Gruplama anahtarları için alternatif bir form -(Project.a -lc -)'dur.

+0

@Cliford. Benim hatam. Haklısınız Memnunumun hangi uygulamasının benim kodumun bağlanmasını istediğimi seçmenin bir yolu var mı? Project.a ve libc.a arasındaki bağlantı sırasını değiştiremiyorum çünkü projemde libc.a'nın – maguirre

+2

gereksinim duyduğu bazı saplama işlevleri var: @Mischief: Alternatif olarak, newlib uzantılarınızı proje dosyalarınızdan ayırarak Project.a -lc taslakları .a'. Proje dosyalarınız için bir arşiv kullanmak, yapmak için olağandışı bir şeydir; Nesne dosyalarını doğrudan norm olduğu gibi bağlayarak sorunu tamamen ortadan kaldırabilirsiniz. Nesne dosyalarındaki kod, bağlantı sırasına bakılmaksızın her zaman kütüphane kodunun tercihinde kullanılacaktır; böylece libc taslakları eşleşen sembollerle bağladığınız herhangi bir nesne kodu ile çözülür ve herhangi bir nesne kodu kütüphane kodundan önce diğer nesne kodundan çözülür, böylece memcpy() libc içindeki çağrılar için bile doğru şekilde geçersiz kılınacaktır. – Clifford

+0

Bir arşivdeki kodun alışılmadık olması hakkındaki yorumunuza katılıyorum. Eğer benim yoluma sahip olduğumda değişecek – maguirre

İlgili konular