Skip to content

Commit

Permalink
modpost: lto: strip .lto from module names
Browse files Browse the repository at this point in the history
With LTO, everything is compiled into LLVM bitcode, so we have to link
each module into native code before modpost. Kbuild uses the .lto.o
suffix for these files, which also ends up in module information. This
change strips the unnecessary .lto suffix from the module name.

Suggested-by: Bill Wendling <[email protected]>
Signed-off-by: Sami Tolvanen <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
samitolvanen authored and kees committed Jan 14, 2021
1 parent 09a4e4d commit 7ac204b
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 10 deletions.
16 changes: 7 additions & 9 deletions scripts/mod/modpost.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include <ctype.h>
#include <string.h>
#include <limits.h>
#include <stdbool.h>
#include <errno.h>
#include "modpost.h"
#include "../../include/linux/license.h"
Expand Down Expand Up @@ -84,14 +83,6 @@ modpost_log(enum loglevel loglevel, const char *fmt, ...)
error_occurred = true;
}

static inline bool strends(const char *str, const char *postfix)
{
if (strlen(str) < strlen(postfix))
return false;

return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
}

void *do_nofail(void *ptr, const char *expr)
{
if (!ptr)
Expand Down Expand Up @@ -1988,6 +1979,10 @@ static char *remove_dot(char *s)
size_t m = strspn(s + n + 1, "0123456789");
if (m && (s[n + m] == '.' || s[n + m] == 0))
s[n] = 0;

/* strip trailing .lto */
if (strends(s, ".lto"))
s[strlen(s) - 4] = '\0';
}
return s;
}
Expand All @@ -2011,6 +2006,9 @@ static void read_symbols(const char *modname)
/* strip trailing .o */
tmp = NOFAIL(strdup(modname));
tmp[strlen(tmp) - 2] = '\0';
/* strip trailing .lto */
if (strends(tmp, ".lto"))
tmp[strlen(tmp) - 4] = '\0';
mod = new_module(tmp);
free(tmp);
}
Expand Down
9 changes: 9 additions & 0 deletions scripts/mod/modpost.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
Expand Down Expand Up @@ -180,6 +181,14 @@ static inline unsigned int get_secindex(const struct elf_info *info,
return info->symtab_shndx_start[sym - info->symtab_start];
}

static inline bool strends(const char *str, const char *postfix)
{
if (strlen(str) < strlen(postfix))
return false;

return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
}

/* file2alias.c */
extern unsigned int cross_build;
void handle_moddevtable(struct module *mod, struct elf_info *info,
Expand Down
6 changes: 5 additions & 1 deletion scripts/mod/sumversion.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,10 +391,14 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen)
struct md4_ctx md;
char *fname;
char filelist[PATH_MAX + 1];
int postfix_len = 1;

if (strends(modname, ".lto.o"))
postfix_len = 5;

/* objects for a module are listed in the first line of *.mod file. */
snprintf(filelist, sizeof(filelist), "%.*smod",
(int)strlen(modname) - 1, modname);
(int)strlen(modname) - postfix_len, modname);

buf = read_text_file(filelist);

Expand Down

0 comments on commit 7ac204b

Please sign in to comment.