DDE legacy kernel module as library

Michael Roitzsch mroi at os.inf.tu-dresden.de
Wed Feb 18 11:06:33 CET 2009

Hi Andre,

> I want to keep the legacy kernel module code inside a separate  
> library which is than linked to my DDE application. The module's  
> "init" method is included in the library but not inside the final  
> binary. That's why it is not called by l4dde26_do_initcalls().

When creating the final binary, the linker has the habit of throwing  
code out it considers unused. For library constructors, this can go  
wrong, because the calls to them are generated only at runtime and are  
thus not visible to the linker, which then wrongly concludes to drop  

The fix (actually it's more of a workaround) is to rename the static  
library in the Makefile TARGET from libdriver.a to libdriver.o.a. This  
causes the build system to combine the individual objects into one  
large object instead of a regular static library archive. You can  
later link to that lib with -ldriver.o as expected.

The effect is that the linker cannot throw code out of such a lib,  
because to it, this is essentially one large object file and the GNU  
linker only drops code with object granularity. (So this uses one  
peculiarity of the GNU linker to fix another one.)


More information about the l4-hackers mailing list