前提・実現したいこと
リンカスクリプトを用いたリンクに失敗します。
表示されるエラー kernel.o: In function `_kernel_entry': KERNEL.c:(.text+0x5): undefined reference to `_BSS_START' KERNEL.c:(.text+0xa): undefined reference to `_BSS_END' KERNEL.c:(.text+0x13): undefined reference to `initBSS'
c
1KERNEL.c 2 3#include "include/section.h" 4#include "include/memory.h" 5 6int _kernel_entry( void ){ 7 initBSS( _BSS_START, _BSS_END - _BSS_START ); 8 for( ;; ) 9 { 10 } 11}
section.h extern unsigned int _TEXT_START; extern unsigned int _TEXT_END; extern unsigned int _BSS_START; extern unsigned int _BSS_END;
c
1section.c 2 3unsigned int _TEXT_START = ( unsigned int )&_text_start; 4unsigned int _TEXT_END = ( unsigned int )&_text_end; 5unsigned int _BSS_START = ( unsigned int )&_bss_start; 6unsigned int _BSS_END = ( unsigned int )&_bss_end;
memory.h void initBSS( unsigned int kernel_bss_start, int size );```
c
1memory.c 2 3#include "kstdlib.h" 4void initBSS( unsigned int kernel_bss_start, int size ){ 5 kmemset( ( void * )kernel_bss_start, 0x00, size ); 6}
kstdlib.h void kmemset(void *str,unsigned char c,int size);
c
1kstdlib.c 2 3void kmemset(void *str,unsigned char c,int size){ 4 unsigned char *ptr = (unsigned char*)str; 5 const unsigned char ch = (const unsigned char)c; 6 while(size--){ 7 *ptr++=ch; 8 } 9}
リンカスクリプト(linker.link) SECTIONS { . = 0x100000; .text : { _text_start = .; *(.text) _text_end = .; } .rodata : { _rodata_start = .; *(.rodata) _rodata_end = .; } .data : { _data_start = .; *(.data) _data_end = .; } .bss : { _bss_start = .; *(.bss) _bss_end = .; } }
試したこと
フォルダの構成は、現在のフォルダにKERNEL.cとリンカスクリプトとincludeフォルダがあり、includeフォルダの中にmemory.c,memory.h,section.c,section.h,kstdlib.c,kstdlib.hがある状態です。
現在のフォルダにいる状態で、
i386-elf-gcc -c -o kernel.o KERNEL.c -O2 -I /include -Wall
とコンパイルしました。その後、
i386-elf-ld -T linker.link -Map kernel.map -nostdlib -e _kernel_entry
--oformat binary -o KIMAGE kernel.o
とリンクしたところ最初に書いたエラーが出てしまいリンクできません。
memory.cをオブジェクトファイルにしなければならないのかなと思いましたが、
リンカスクリプトのシンボルを参照しているためそれも出来そうになく困っています。
補足情報(FW/ツールのバージョンなど)
macOS high sierra
gcc version 6.5.0 (GCC)
GNU ld (GNU Binutils) 2.28
追記
section.cをコンパイルしてオブジェクトファイルに出来ず、
error: '_text_start' undeclared here
というエラーを吐いてしまいます。
この_text_startですが、これはリンカスクリプト内で定義しているはずなのですが・・・。
回答1件
あなたの回答
tips
プレビュー