views:

403

answers:

1

I'm following the kernel tutorial from here

im having problems compiling my files.

i get the following errors when i try to compile:

main.c:8: error: expected declaration specifiers or ‘...’ before ‘size_t’
main.c:8: error: conflicting types for ‘memcpy’                          
./include/system.h:5: note: previous declaration of ‘memcpy’ was here    
main.c: In function ‘memcpy’:                                            
main.c:12: error: ‘count’ undeclared (first use in this function)        
main.c:12: error: (Each undeclared identifier is reported only once      
main.c:12: error: for each function it appears in.)                      
main.c: At top level:                                                    
main.c:16: error: expected declaration specifiers or ‘...’ before ‘size_t’
main.c:16: error: conflicting types for ‘memset’
./include/system.h:6: note: previous declaration of ‘memset’ was here
main.c: In function ‘memset’:
main.c:19: error: ‘count’ undeclared (first use in this function)
main.c: At top level:
main.c:23: error: expected declaration specifiers or ‘...’ before ‘size_t’
main.c:23: error: conflicting types for ‘memsetw’
./include/system.h:7: note: previous declaration of ‘memsetw’ was here
main.c: In function ‘memsetw’:
main.c:26: error: ‘count’ undeclared (first use in this function)
main.c: At top level:
main.c:30: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strlen’
main.c:49: warning: return type of ‘main’ is not ‘int’
main.c: In function ‘main’:
main.c:64: warning: pointer targets in passing argument 1 of ‘puts’ differ in    signedness
./include/system.h:13: note: expected ‘unsigned char *’ but argument is of type ‘char *’
main.c:51: warning: unused variable ‘i’
scrn.c: In function ‘scroll’:
scrn.c:24: warning: passing argument 1 of ‘memcpy’ from incompatible pointer type
./include/system.h:5: note: expected ‘unsigned char *’ but argument is of type ‘short unsigned int *’
scrn.c:24: warning: passing argument 2 of ‘memcpy’ from incompatible pointer type
./include/system.h:5: note: expected ‘const unsigned char *’ but argument is of type  ‘short unsigned int *’
scrn.c: In function ‘puts’:
scrn.c:139: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
./include/system.h:8: note: expected ‘const char *’ but argument is of type ‘unsigned char *’

My files are exact copies of the ones from the tutorial.
I can see that in main.c the functions are defined like so

void *memcpy(void *dest,const void *src, size_t count)

but in my system.h file they are defined like so

extern unsigned char *memcpy(unsigned char *dest,const unsigned char *src, int count)

C is not my primary language but i am in the process of learning it so I apologize if my question is simple but I would think that these definitions should be the same not?

+3  A: 

Probably your issue is that size_t isn't the same as int on your platform, or size_t isn't specified correctly at all. The pointer types should be OK (technically, they should match too, but on most systems sizeof(char*) == sizeof(void*)).

If you're developing your own kernel, you'd want to write your own system.h. If you're writing both system.h and main.c, you can make them match up however you'd like. If you look at this page of the tutorial, you'd see that header and C source both declare memcpy as:

unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count);

But if you download the example source files at the end of the tutorial, you find it is instead:

void *memcpy(void *dest, const void *src, size_t count);

Looking at the top of that file, you find the following comment:

/* bkerndev - Bran's Kernel Development Tutorial
*  By:   Brandon F. ([email protected])
*  Desc: Main.c: C code entry.
*
*  Notes: No warranty expressed or implied. Use at own risk. */

It doesn't look like you're trying to follow a tutorial, but rather that you're trying to cut and paste code from a tutorial. That's like trying to learn to perform brain surgery by following along in a book. You might get it to work, but if you don't really understand what you're doing... well, please do the world a favor and don't use it for anything critical.

Daniel Pryden
lol. well its more like im trying to use a tutorial to understand how a kernel works a little bit better but since i don't know all the ins and outs of C im forced to just using the code already provided. Thanks for the advice!
controlfreak123