[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220424190811.1678416-25-masahiroy@kernel.org>
Date: Mon, 25 Apr 2022 04:08:08 +0900
From: Masahiro Yamada <masahiroy@...nel.org>
To: linux-kbuild@...r.kernel.org
Cc: linux-kernel@...r.kernel.org,
Masahiro Yamada <masahiroy@...nel.org>,
Michal Marek <michal.lkml@...kovi.net>,
Nick Desaulniers <ndesaulniers@...gle.com>,
Nicolas Schier <nicolas@...sle.eu>,
Rasmus Villemoes <linux@...musvillemoes.dk>
Subject: [PATCH 24/27] modpost: generate linker script to collect symbol versions
Merge version CRCs per vmlinux or per module.
These linker scripts will be fed to the final link stage.
Signed-off-by: Masahiro Yamada <masahiroy@...nel.org>
---
.gitignore | 1 +
Makefile | 1 +
scripts/mod/modpost.c | 27 +++++++++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/.gitignore b/.gitignore
index 265959544978..f9dad6b917e6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,7 @@
*.so.dbg
*.su
*.symtypes
+*.symver.lds
*.symversions
*.tab.[ch]
*.tar
diff --git a/Makefile b/Makefile
index 235d68fa1470..0779db3d1c0c 100644
--- a/Makefile
+++ b/Makefile
@@ -1859,6 +1859,7 @@ clean: $(clean-dirs)
-o -name '*.c.[012]*.*' \
-o -name '*.ll' \
-o -name '*.gcno' \
+ -o -name '*.symver.lds' \
-o -name '*.*.symversions' \) -type f -print | xargs rm -f
# Generate tags for editors
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 43ab4f000ae3..ef779ada04c6 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -2577,6 +2577,30 @@ static void write_dump(const char *fname)
free(buf.p);
}
+static void write_symversions_lds(struct module *mod)
+{
+ struct buffer buf = { };
+ struct symbol *sym;
+ char lds_file[PATH_MAX];
+ int ret;
+
+ ret = snprintf(lds_file, sizeof(lds_file), "%s.symver.lds", mod->name);
+ if (ret >= sizeof(lds_file)) {
+ error("%s: too long path was truncated\n", lds_file);
+ return;
+ }
+
+ list_for_each_entry(sym, &mod->exported_symbols, list) {
+ if (!sym->crc_valid)
+ continue;
+
+ buf_printf(&buf, "__crc_%s = 0x%08x;\n", sym->name, sym->crc);
+ }
+
+ write_if_changed(&buf, lds_file);
+ free(buf.p);
+}
+
static void write_namespace_deps_files(const char *fname)
{
struct module *mod;
@@ -2673,6 +2697,9 @@ int main(int argc, char **argv)
char fname[PATH_MAX];
int ret;
+ if (modversions && !mod->from_dump)
+ write_symversions_lds(mod);
+
if (mod->is_vmlinux || mod->from_dump)
continue;
--
2.32.0
Powered by blists - more mailing lists