On Mon, 28 May 2012, David Laight wrote:
On Mon, May 28, 2012 at 11:38:09AM -0700, Paul Goyette wrote:How would __link_set_process() know how many entries to process? What would indicate the end of the data?It has the program headers eg (from a random module): Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000160e 00000000 00000000 00000040 2**4 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .rodata.str1.1 00000105 00000000 00000000 0000164e 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .rodata.str1.4 000001bc 00000000 00000000 00001754 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .rodata 00000099 00000000 00000000 00001920 2**5 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA 4 link_set_modules 00000004 00000000 00000000 000019bc 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA 5 link_set_sysctl_funcs 00000004 00000000 00000000 000019c0 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA 6 .data 000000a4 00000000 00000000 000019e0 2**5 CONTENTS, ALLOC, LOAD, RELOC, DATA 7 .ident 00000071 00000000 00000000 00001a84 2**0 CONTENTS, READONLY
Unless I've missed something in my explorations, this data is not available for the "monolithic kernel". So a built-in module needs the {start,end} symbols to learn where the program sections are loaded.
Modules that are loaded by the run-time linker _do_ have the above info, but do not have the symbols.
When it processes section 5 it allocates 4 bytes somewhere ... Since the entries are all pointers (actually it ought to be possible to use any fixes size structure) it known where the end is.
Section 5 deals with the SYSCTL_SETUP() stuff. When modules create a sysctl(9) sub-tree, they have to explicitly call sysctl_createv() since the initializer(s) defined by SYSCTL_SETUP doesn't get called.
(The code that does call the SYSCTL_SETUP() initializers uses the __link_set_foreach() macro which depends on the {start,end} symbols - see sysctl_init() in src/sys/kern_sysctl.c)
So, I'm still hoping to see a prototype the works for both built-in and independantly-linked modules ...
:) ------------------------------------------------------------------------- | Paul Goyette | PGP Key fingerprint: | E-mail addresses: | | Customer Service | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com | | Network Engineer | 0786 F758 55DE 53BA 7731 | pgoyette at juniper.net | | Kernel Developer | | pgoyette at netbsd.org | -------------------------------------------------------------------------