I have been using colinux for the last 6 years under Windows XP and then Windows Vista. It has always worked great. However, I have never tried to build coLinux from scratch. Today, due to the reason that I need a kernel module that is not in the module list provided by the stock colinux build image, I had to go through this exercise.
Overall it is a fairly straightforward process. But I need to make the notes so that later on other people can find it useful.
It is better to have a fast machine, a fast internet connection, and over 1GB of free disk space.
My host machine is Ubuntu 10.04 running in X86-64bit mode. The final image of colinux kernel is 32-bit. The build process automatically does that for you.
1. Download the latest snapshot release source tar ball from www.colinux.org/snapshots/
2. untar it, cd to devel-coLinux...
3. ./configure
4. make
This will download gcc,bin-utils,mingw32, kernel source, etc
5. You will find you kernel (vmlinux) and modules tar.gz file in the build directory,which should be displayed on the console when the build started.
--To rebuild the kernel with your modified config file--
1. go to the kernel build directory, where your vmlinux file is located.
2. backup your current config file: cp .config good_config
3. change the config file: make ARCH=i386 menuconfig
4. go to your devel-coLinux-xxx directory, do "make kernel"
October 20, 2011
October 12, 2011
linux dynamic library executable and initialization
-----------
C file
-------------
/* initialization when .so is loaded */
static int (*libc_flock)(int fd, int operation)=NULL;
int flock(int fd, int operation){
printf("my flock called. fd=%d operation=%d\n",fd,operation);
if (!handle){
handle=dlopen("/lib/libc.so.6",RTLD_LAZY);
}
if (!libc_flock){
libc_flock=dlsym(handle,"flock");
if (libc_flock==NULL)
return NULL;
}
return libc_flock(fd,operation);
}
__attribute__((constructor)) static void mylib_init(void){
printf("============>\nmylib is initialized\n================>\n");
}
/* this part of code make your .so executable */
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
void my_main(int argc, char **argv) {
int i;
printf("Called as:");
for (i = 0; i < argc; i++)
printf(" %s", argv[i]);
printf("\n");
exit(0);
}
--------------
Makefile:
----------------
libmylib.so: mylib.c
$(CC) -shared -Wl,-soname,$@ -fPIC -O2 -s -o $@ $^ -ldl -Wl,-e,my_main
October 7, 2011
October 4, 2011
C/C++ dbug library
There are many debug libraries available for C/C++. Recently I started looking into the "dbug" library created by Fred Fish in 1988 and released to public. You can download the library at source forge .
The library has just one C file: dbug.c and one header file: dbug.h (another header file dbug_long.h has more comments can be used in place of dbug.h)
The concept is that you can turn debug on/off on the fly; enable per-function tracing; and other stuff such as profiling which usually you don't need.
To use it:
First, you initialize it by doing this:
DBUG_PUSH ("d:t:O:L:");
The library has just one C file: dbug.c and one header file: dbug.h (another header file dbug_long.h has more comments can be used in place of dbug.h)
The concept is that you can turn debug on/off on the fly; enable per-function tracing; and other stuff such as profiling which usually you don't need.
To use it:
First, you initialize it by doing this:
DBUG_PUSH ("d:t:O:L:");
Then in every function, you begin your function code with:
DBUG_ENTER ("my_function_name");
End your function with either
DBUG_VOID_RETURN;
or
DBUG_RETURN (0);
if you return integer 0.
To use printf to debug something, use this macro:
DBUG_PRINT ("info", ("Returned value: %d", ret));
where "info" is your keyword/category of debugs. In DBUG_PUSH, you can use "d,keyword1,keyword2..." to turn on/off a list of categories that you want to debug.
Note that there is a file "example.c" in the root directory of the downloaded package, which shows you how to use the library.
The debug control string is a sequence of colon separated fields
as follows:
<field_1>:<field_2>:<field_N>
Each field consists of a mandatory flag character followed by an optional "," and comma separated list of modifiers:
flag[,modifier,modifier,...,modifier]
The currently recognized flag characters are:
d Enable output from DBUG_ macros for
for the current state. May be followed
by a list of keywords which selects output
only for the DBUG macros with that keyword.
A null list of keywords implies output for
all macros.
D Delay after each debugger output line.
The argument is the number of tenths of seconds
to delay, subject to machine capabilities.
I.E. -#D,20 is delay two seconds.
f Limit debugging and/or tracing, and profiling to the
list of named functions. Note that a null list will
disable all functions. The appropriate "d" or "t"
flags must still be given, this flag only limits their
actions if they are enabled.
F Identify the source file name for each
line of debug or trace output.
i Identify the process with the pid for each line of
debug or trace output.
g Enable profiling. Create a file called 'dbugmon.out'
containing information that can be used to profile
the program. May be followed by a list of keywords
that select profiling only for the functions in that
list. A null list implies that all functions are
considered.
L Identify the source file line number for
each line of debug or trace output.
n Print the current function nesting depth for
each line of debug or trace output.
N Number each line of dbug output.
o Redirect the debugger output stream to the
specified file. The default output is stderr.
O As O but the file is really flushed between each
write. When needed the file is closed and reopened
between each write.
p Limit debugger actions to specified processes.
A process must be identified with the
DBUG_PROCESS macro and match one in the list
for debugger actions to occur.
P Print the current process name for each
line of debug or trace output.
r When pushing a new state, do not inherit
the previous state's function nesting level.
Useful when the output is to start at the
left margin.
S Do function _sanity(_file_,_line_) at each
debugged function until _sanity() returns
something that differs from 0.
(Mostly used with safemalloc)
t Enable function call/exit trace lines.
May be followed by a list (containing only
one modifier) giving a numeric maximum
trace level, beyond which no output will
occur for either debugging or tracing
macros. The default is a compile time
option.
Some examples of debug control strings which might appear
on a shell command line (the "-#" is typically used to
introduce a control string to an application program) are:
<field_1>:<field_2>:<field_N>
Each field consists of a mandatory flag character followed by an optional "," and comma separated list of modifiers:
flag[,modifier,modifier,...,modifier]
The currently recognized flag characters are:
-#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:nFor convenience, any leading "-#" is stripped off.