]> sourceware.org Git - libabigail.git/commit
add Linux kernel symbol namespace support
authorGiuliano Procida <gprocida@google.com>
Mon, 13 Jun 2022 14:25:33 +0000 (15:25 +0100)
committerDodji Seketeli <dodji@redhat.com>
Fri, 1 Jul 2022 12:51:27 +0000 (14:51 +0200)
commit7e18fc8ad8c00db49e8889f28198bfdcedeb4a03
tree536a5db338d1ba630cbc4ff6bd85af594c030450
parent89e6854ca4408654bb5ff5665864d80a0ae45b72
add Linux kernel symbol namespace support

Bug 28954 - add Linux Kernel symbol namespace support

Each Linux kernel symbol can be exported to a specified named
namespace or left in the global (nameless) namespace.

One complexity is that the symbol values which identify a string in
the __ksymtab_strings section must be interpretated differently for
vmlinux and .ko loadable modules as the former has a fixed load
address but the latter are relocatable. For vmlinux, the section base
address needs to be subtracted to obtain a section-relative offset.

The global namespace is explicitly represented as the empty string, at
least when it comes to the value of __kstrtabns_FOO symbols, but the
common interpretation is that such symbols lack an export namespace.

I would rather not have to make use of "empty implies missing" in many
places, so the code here represents namespace as optional<string> and
only the symtab reader cares about empty strings in __ksymtab_strings.

* include/abg-ir.h (elf_symbol::elf_symbol): Add ns argument.
(elf_symbol::create): Add ns argument.
(elf_symbol::get_namespace): Declare new function.
(elf_symbol::set_namespace): Declare new function.
and set_namespace.
* src/abg-comp-filter.cc (namespace_changed): Define new
helper functions.
(categorize_harmful_diff_node): Also call namespace_changed().
* src/abg-ir.cc (elf_symbol::priv): Add namespace_ member.
(elf_symbol::priv::priv): Add namespace_ to initialisers.
(elf_symbol::elf_symbol): Take new ns argument and pass it to
priv constructor.
(elf_symbol::create): Take new ns argument and pass it to
elf_symbol constructor.
(elf_symbol::get_namespace): Define new function.
(elf_symbol::set_namespace): Define new function.
* src/abg-reader.cc (build_elf_symbol): If namespace
attribute is present, set symbol namespace.
* src/abg-reporter-priv.cc (maybe_report_diff_for_symbol): If
symbol namespaces differ, report this.
* src/abg-symtab-reader.cc (symtab::load): Get ELF header to
distinguish vmlinux from .ko. Try to get __ksymtab_strings
metadata and data. Use these to look up __kstrtabns_FOO
namespace entries. Set symbol namespace where found.
* src/abg-writer.cc (write_elf_symbol): Emit namespace
attribute, if symbol has a namespace.
* tests/data/Makefile.am: Add new test files.
* tests/data/test-abidiff/test-namespace-0.xml: New test file.
* tests/data/test-abidiff/test-namespace-1.xml: Likewise
* tests/data/test-abidiff/test-namespace-report.txt: Likewise.
* tests/test-abidiff.cc: Add new test case.

Reviewed-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
12 files changed:
include/abg-ir.h
src/abg-comp-filter.cc
src/abg-ir.cc
src/abg-reader.cc
src/abg-reporter-priv.cc
src/abg-symtab-reader.cc
src/abg-writer.cc
tests/data/Makefile.am
tests/data/test-abidiff/test-namespace-0.xml [new file with mode: 0644]
tests/data/test-abidiff/test-namespace-1.xml [new file with mode: 0644]
tests/data/test-abidiff/test-namespace-report.txt [new file with mode: 0644]
tests/test-abidiff.cc
This page took 0.033693 seconds and 5 git commands to generate.