History

modpost: Add modname to mod_device_table alias

At this point, if a symbol is compiled as part of the kernel, information about which module the symbol belongs to is lost. To save this it is possible to add the module name to the alias name. It's not very pretty, but it's possible for now.

Alexey Gladkov committed 1 year ago

Commit 83fb4931 parent b88f88c3 files · +29 −8Browse files

Unified · Split

3 files
  1. include/linux/module.h +13 −1
  2. rust/kernel/device_id.rs +4 −4
  3. scripts/mod/file2alias.c +12 −3
include/linux/module.h+13−1
@@ -244,10 +244,22 @@ struct module_kobject *lookup_or_create_module_kobject(const char *name); · 243 unmodified lines
244/* What your module does. */244/* What your module does. */
245#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)245#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
246 246
247/*
248 * Format: __mod_device_table__kmod_<modname>__<type>__<name>
249 * Parts of the string `__kmod_` and `__` are used as delimiters when parsing
250 * a symbol in file2alias.c
251 */
252#define __mod_device_table(type, name) \
253 __PASTE(__mod_device_table__, \
254 __PASTE(__KBUILD_MODNAME, \
255 __PASTE(__, \
256 __PASTE(type, \
257 __PASTE(__, name)))))
258
247#ifdef MODULE259#ifdef MODULE
248/* Creates an alias so file2alias.c can find device table. */260/* Creates an alias so file2alias.c can find device table. */
249#define MODULE_DEVICE_TABLE(type, name) \261#define MODULE_DEVICE_TABLE(type, name) \
250static typeof(name) __mod_device_table__##type##__##name \262static typeof(name) __mod_device_table(type, name) \
251 __attribute__ ((used, alias(__stringify(name))))263 __attribute__ ((used, alias(__stringify(name))))
252#else /* !MODULE */264#else /* !MODULE */
253#define MODULE_DEVICE_TABLE(type, name)265#define MODULE_DEVICE_TABLE(type, name)
rust/kernel/device_id.rs+4−4
@@ -195,10 +195,10 @@ macro_rules! module_device_table { · 194 unmodified lines
195 ($table_type: literal, $module_table_name:ident, $table_name:ident) => {195 ($table_type: literal, $module_table_name:ident, $table_name:ident) => {
196 #[rustfmt::skip]196 #[rustfmt::skip]
197 #[export_name =197 #[export_name =
198 concat!("__mod_device_table__", $table_type,198 concat!("__mod_device_table__", line!(),
199 "__", module_path!(),199 "__kmod_", module_path!(),
200 "_", line!(),200 "__", $table_type,
201 "_", stringify!($table_name))201 "__", stringify!($table_name))
202 ]202 ]
203 static $module_table_name: [::core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] =203 static $module_table_name: [::core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] =
204 unsafe { ::core::mem::transmute_copy($table_name.raw_ids()) };204 unsafe { ::core::mem::transmute_copy($table_name.raw_ids()) };
scripts/mod/file2alias.c+12−3
@@ -1476,7 +1476,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, · 1475 unmodified lines
1476{1476{
1477 void *symval;1477 void *symval;
1478 char *zeros = NULL;1478 char *zeros = NULL;
1479 const char *type, *name;1479 const char *type, *name, *modname;
1480 size_t typelen;1480 size_t typelen;
1481 static const char *prefix = "__mod_device_table__";1481 static const char *prefix = "__mod_device_table__";
1482 1482
@@ -1488,10 +1488,19 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, · 5 unmodified lines
1488 if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)1488 if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
1489 return;1489 return;
1490 1490
1491 /* All our symbols are of form __mod_device_table__<type>__<name>. */1491 /* All our symbols are of form __mod_device_table__kmod_<modname>__<type>__<name>. */
1492 if (!strstarts(symname, prefix))1492 if (!strstarts(symname, prefix))
1493 return;1493 return;
1494 type = symname + strlen(prefix);1494
1495 modname = strstr(symname, "__kmod_");
1496 if (!modname)
1497 return;
1498 modname += strlen("__kmod_");
1499
1500 type = strstr(modname, "__");
1501 if (!type)
1502 return;
1503 type += strlen("__");
1495 1504
1496 name = strstr(type, "__");1505 name = strstr(type, "__");
1497 if (!name)1506 if (!name)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t