|  | Barret Rhoden | 
|  | 2013-03-28 | 
|  |  | 
|  | It's possible to take platform independent programs compiled for Akaros or | 
|  | Linux and link them to run on the other OS, within limits. | 
|  |  | 
|  | The basic way to do this is to simply compile them into .o files, and then | 
|  | link them, like so (for ros-compiled, linux-linked): | 
|  |  | 
|  | $ i686-ros-gcc -c file1.c -o file1.o (plus flags) | 
|  | $ i686-ros-gcc -c file2.c -o file2.o (plus flags) | 
|  | $ gcc file1.o file2.o -o program | 
|  |  | 
|  | For linux-compiled, Akaros-linked | 
|  | $ g++ -c file1.cc -o file1.o (plus flags) | 
|  | $ g++ -c file2.cc -o file2.o (plus flags) | 
|  | $ i686-ros-g++ file1.o file2.o -o program | 
|  |  | 
|  | There are a number of limitations.  Obviously your program needs to be | 
|  | platform independent, regardless of ifdefs.  You can't call syscalls directly | 
|  | or anything, even if those are ifdef _MY_OS_, since they will actually compile | 
|  | for the wrong target.  The code can only interface with libraries. | 
|  |  | 
|  | Another important limitation is that our libraries (like pthreads) may have | 
|  | the same API as on Linux, but we don't have the same ABI.  For example, the | 
|  | size of a pthread_attr_t on 32 bit linux is 36 bytes.  On Akaros, it is 8 | 
|  | bytes (for now!).  In this case, if you compile for Akaros, the compiler only | 
|  | reserves 8 bytes for the attr, but the Linux pthread libraries will expect to | 
|  | be able to write 36 bytes.  Unless your program pads these items, you'll | 
|  | clobber important memory. | 
|  |  | 
|  | A temporary hack to make one compiler have the correct sizes is to change the | 
|  | header file so the objects your program uses are the 'right' size.  Compile, | 
|  | then change the header back. | 
|  |  | 
|  | As of the time of this writing, on 32 bit systems: | 
|  | /* On linux: | 
|  | * sizeof pth attr:    36 | 
|  | * sizeof pth t:       4 | 
|  | * sizeof pth mutex:   24 | 
|  | * sizeof pth barrier: 20 | 
|  | * | 
|  | * On Akaros: | 
|  | * sizeof pth attr:    8 | 
|  | * sizeof pth t:       4 | 
|  | * sizeof pth mutex:   8 | 
|  | * sizeof pth barrier: 28 */ | 
|  |  | 
|  | Additionally, C++ streams don't seem to work.  There's some sort of segfault | 
|  | in the C++ libraries, probably related to ABI mismatches and memory | 
|  | clobbering.  You could just rewrite your application to not use iostreams, or | 
|  | you could poke around in the gcc stage2 build and see what the problem is.  At | 
|  | least, if you're running on Linux, you have gdb to help you debug! |