| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # | |
| # find_export() matched on symbol name alone, so a static function or variable | |
| # sharing a name with an export was mistaken for a reference to that export. | |
| # For a vmlinux export that means no klp relocation at all: the normal | |
| # relocation left behind is resolved by the module loader to the vmlinux | |
| # symbol, and the patched code quietly reads and writes the wrong object. | |
| # | |
| # Exports are always global, so a local symbol is never one. | |
| . "$(dirname "$0")/../lib.sh" | |
| setup | |
| build_pair static_local.c | |
| # The static the fixture uses. Compilers mangle statics variously -- gcc says | |
| # counter.0, clang says target.counter -- so find what this one produced rather | |
| # than assuming a shape. | |
| local_sym="$(in_symbols orig.o | | |
| awk '$4 == "OBJECT" && $5 == "LOCAL" && $8 ~ /counter/ { print $8; exit }')" | |
| [ -n "$local_sym" ] || | |
| fail "fixture produced no local 'counter' symbol" | |
| # Contrive the collision: something else exports that same name. | |
| export_syms "$local_sym" counter | |
| run_diff | |
| # Still treated as the local it is, not as the export. | |
| assert_klp_sym "$local_sym" vmlinux | |
| pass "local symbol not mistaken for an export of the same name" |