Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Apr 2023 12:55:02 +0200
From:      Hans Petter Selasky <hselasky@freebsd.org>
To:        Zhenlei Huang <zlei@FreeBSD.org>, FreeBSD CURRENT <freebsd-current@freebsd.org>
Cc:        Gleb Smirnoff <glebius@FreeBSD.org>
Subject:   Re: Link modules to DYN type
Message-ID:  <2bb66cac-c7f1-e45b-693a-8afbda05cfa6@freebsd.org>
In-Reply-To: <97390FE1-1DF5-43A1-A3F4-2B945D681437@FreeBSD.org>
References:  <97390FE1-1DF5-43A1-A3F4-2B945D681437@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 4/26/23 12:36, Zhenlei Huang wrote:
> Hi,
> 
> I'm recently working on https://reviews.freebsd.org/D39638 (sysctl(9): Enable vnet sysctl variables be loader tunable),
> the changes to `sys/kern/link_elf_obj.c` are runtime tested, but not those to `sys/kern/link_elf.c` .
> 
> After some hacking I realized that `link_elf.c` is for EXEC (Executable file) or DYN (Shared object file), and `link_elf_obj.c` is
> for REL (Relocatable file).
> 
> ```
> /* link_elf.c */
> static int
> link_elf_load_file(linker_class_t cls, const char* filename,
>      linker_file_t* result)
> {
> ...
> 	if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) {
> 		error = ENOSYS;
> 		goto out;
> 	}
> ...
> }
> 
> 
> /* link_elf_obj.c */
> static int
> link_elf_load_file(linker_class_t cls, const char *filename,
>      linker_file_t *result)
> {
> ...
> 	if (hdr->e_type != ET_REL) {
> 		error = ENOSYS;
> 		goto out;
> 	}
> ...
> }
> ```
> 
> Run the following snip:
> ```
> # find /boot/kernel -type f -name "*.ko" -exec readelf -h {} \; | grep Type
> ```
> shows that all the kernel modules' types are `REL (Relocatable file)`.
> 
> I guess if some module such as if_bridge is linked to DYN type, then I can do runtime for the changes to `sys/kern/link_elf.c`.
> 
> I'm not familiar with elf and linkers, is that ( compile module and link it to DYN type ) possible ?
> 

Hi,

I don't have an answer for you either, but I have seen in the past, 
loading kernel modules behaves a bit like libraries, in the following 
regard:

If two kernel modules define the same global symbol, then no warning is 
given and the first loaded symbol definition (I think) is used to 
resolve that symbol for all kernel modules, regardless of the prototype. 
Probably we should not allow this. That's why building LINT is a good 
thing, to avoid this issue.

Even if we don't have C++ support in the FreeBSD kernel, defining symbol 
names the way C++ does for C could be nice for the kernel too, also with 
regards to debugging systems.

Many times when I don't know what is going on, I do like this:

#include <sys/kdb.h>

....

if (not too fast or my sysctl debug) {
   printf("My tracer\n");
   kdb_backtrace();
}

Dtrace can also do this, but not during boot. Just track who is calling 
those functions, and you'll probably find the answer to your question!

--HPS

> 
> Best regards,
> Zhenlei
> 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2bb66cac-c7f1-e45b-693a-8afbda05cfa6>