Matthew Maurer <mmaurer@xxxxxxxxxx> writes: > Adds a new format for MODVERSIONS which stores each field in a separate > ELF section. This initially adds support for variable length names, but > could later be used to add additional fields to MODVERSIONS in a > backwards compatible way if needed. Any new fields will be ignored by > old user tooling, unlike the current format where user tooling cannot > tolerate adjustments to the format (for example making the name field > longer). > > Since PPC munges its version records to strip leading dots, we reproduce > the munging for the new format. Other architectures do not appear to > have architecture-specific usage of this information. > > Signed-off-by: Matthew Maurer <mmaurer@xxxxxxxxxx> > --- > arch/powerpc/kernel/module_64.c | 24 ++++++++++- > kernel/module/internal.h | 11 +++++ > kernel/module/main.c | 92 +++++++++++++++++++++++++++++++++++++---- > kernel/module/version.c | 45 ++++++++++++++++++++ > 4 files changed, 162 insertions(+), 10 deletions(-) > > diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c > index e9bab599d0c2745e4d2b5cae04f2c56395c24654..02ada0b057cef6b2f29fa7519a5d52acac740ee5 100644 > --- a/arch/powerpc/kernel/module_64.c > +++ b/arch/powerpc/kernel/module_64.c > @@ -355,6 +355,24 @@ static void dedotify_versions(struct modversion_info *vers, > } > } > > +/* Same as normal versions, remove a leading dot if present. */ > +static void dedotify_ext_version_names(char *str_seq, unsigned long size) > +{ > + unsigned long out = 0; > + unsigned long in; > + char last = '\0'; > + > + for (in = 0; in < size; in++) { > + /* Skip one leading dot */ > + if (last == '\0' && str_seq[in] == '.') > + in++; > + last = str_seq[in]; > + str_seq[out++] = last; > + } > + /* Zero the trailing portion of the names table for robustness */ > + memset(&str_seq[out], 0, size - out); > +} Sorry I realise it's version 7, but although the above looks correct it's kind of dense. I think the below would also work and is (I think) easier to follow, and is more obviously similar to the existing code. I'm sure your version is faster, but I don't think it's that performance critical. static void dedotify_ext_version_names(char *str_seq, unsigned long size) { char *end = str_seq + size; char *p = str_seq; while (p < end) { if (*p == '.') memmove(p, p + 1, end - p - 1); p += strlen(p) + 1; } } The tail of str_seq will be filled with nulls as long as the last string was null terminated. cheers