From owner-freebsd-hackers@FreeBSD.ORG Thu Jul 15 14:07:43 2010 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4E6CC1065670 for ; Thu, 15 Jul 2010 14:07:43 +0000 (UTC) (envelope-from krivenok.dmitry@gmail.com) Received: from mail-ew0-f54.google.com (mail-ew0-f54.google.com [209.85.215.54]) by mx1.freebsd.org (Postfix) with ESMTP id D9F2F8FC19 for ; Thu, 15 Jul 2010 14:07:42 +0000 (UTC) Received: by ewy26 with SMTP id 26so241794ewy.13 for ; Thu, 15 Jul 2010 07:07:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=E2ww5eOupjMn95HoqhcUEYWYzCQWEI4SR26bE9QbwZ8=; b=lkKTQKniJBUAzNbqE79QPBnDjzHkLmcjf6RAFxg+JsUYTR0T8WU23vd8g03+AoO0xX rRh7TiyUtCCsRMxBTZZK/zfrQFWbWdiIY1ZMo6We3+Au9qniIxn0l5np79W/kWRW/lEJ NO/Ty+K+6DYRc3riHdBixwf6+357j8RniiUuQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=NHleFL62eGbBf36TkJd+urQb09hXF7Kvv2P3+7pFAhNFZqCq805biWORNJDDsTnwhE vy0wTEMVuZ9Sq5ngK5gJ3lG8lqIUwU0/vAHxzOYzQQTGLK6BN5FU//z4STyFb0zeiQPn +KLDpCkh5UkcnqxJ/3rWmh4ILLuOhTooJsmmk= MIME-Version: 1.0 Received: by 10.213.108.203 with SMTP id g11mr2717800ebp.51.1279202857226; Thu, 15 Jul 2010 07:07:37 -0700 (PDT) Received: by 10.213.23.14 with HTTP; Thu, 15 Jul 2010 07:07:36 -0700 (PDT) Date: Thu, 15 Jul 2010 18:07:36 +0400 Message-ID: From: Dmitry Krivenok To: freebsd-hackers@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Subject: Kernel linker and undefined references in KLD X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Jul 2010 14:07:43 -0000 Hello Hackers, I have a question about kernel linker. Please take a look at an example of simple module: ############################################################################ #include #include #include #include #include #include #include /* DECLARING A FUNCTION JUST TO AVOID WARNING WHICH IS TREAT AS ERROR BY DEFAULT */ void seltdinit(struct thread* t); static int event_handler(struct module *module, int event, void *arg) { int e = 0; switch (event) { case MOD_LOAD: /* CALLING A FUNCTION DECLARED AS STATIC IN kern/sys_generic.c */ seltdinit(curthread); break; case MOD_QUIESCE: break; case MOD_UNLOAD: break; case MOD_SHUTDOWN: break; default: e = EOPNOTSUPP; break; } return(e); }; ############################################################################ As you can see, this module calls seltdinit function declared as _static_ in kern/sys_generic.c file. I added a declaration of seltdinit function w/o static just to avoid compilation error since -Werror is used by default in FreeBSD. Then I successfully built the module: $ make Warning: Object directory not changed from original /usr/home/krived/work/freebsd/trouble cc -O2 -pipe -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE -nostdinc -I. -I@ -I@/contrib/altq -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-sse3 -mno-mmx -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -ffreestanding -fstack-protector -std=iso9899:1999 -fstack-protector -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign -fformat-extensions -c trouble.c ld -d -warn-common -r -d -o trouble.ko trouble.o :> export_syms awk -f /sys/conf/kmod_syms.awk trouble.ko export_syms | xargs -J% objcopy % trouble.ko objcopy --strip-debug trouble.ko $ As expected, seltdinit symbol is undefined in trouble.ko file: $ nm trouble.ko | grep seltdinit U seltdinit $ and is local in kernel binary file: $ nm /boot/kernel/kernel | grep seltdinit ffffffff805fda50 t seltdinit $ I expected to get something like "undefined reference to seltdinit" error, but the module was loaded w/o any errors: $ sudo make load /sbin/kldload -v /usr/home/krived/work/freebsd/trouble/trouble.ko Loaded /usr/home/krived/work/freebsd/trouble/trouble.ko, id=2 $ kldstat | grep trouble 2 1 0xffffffff81212000 126 trouble.ko $ sudo make unload /sbin/kldunload -v trouble.ko Unloading trouble.ko, id=2 $ Could you please explain why the linker (or whatever is loading modules in FreeBSD) doesn't complain? For example, ld tool complains for the similar user-space example: ############################################################################ $ cat seltdinit.c static void seltdinit(void* td) { return; } $ cat main.c void seltdinit(void* td); int main() { seltdinit(0); return 0; } $ gcc -Wall -c seltdinit.c seltdinit.c:2: warning: 'seltdinit' defined but not used $ gcc -Wall -c main.c $ gcc seltdinit.o main.o -o sel main.o: In function `main': main.c:(.text+0xa): undefined reference to `seltdinit' collect2: ld returned 1 exit status $ ############################################################################ Thanks in advance! -- Sincerely yours, Dmitry V. Krivenok e-mail: krivenok.dmitry@gmail.com skype: krivenok_dmitry jabber: krivenok_dmitry@jabber.ru icq: 242-526-443