tools/perf/tests/kallsyms-split.c
Source file repositories/reference/linux-study-clean/tools/perf/tests/kallsyms-split.c
File Facts
- System
- Linux kernel
- Corpus path
tools/perf/tests/kallsyms-split.c- Extension
.c- Size
- 4025 bytes
- Lines
- 158
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/compiler.hfcntl.hsignal.hunistd.hsys/stat.hutil/dso.hutil/map.hutil/symbol.hutil/debug.hutil/machine.htests.h
Detected Declarations
function remove_proc_dirfunction create_proc_dirfunction test__kallsyms_split
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
#include <linux/compiler.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <sys/stat.h>
#include "util/dso.h"
#include "util/map.h"
#include "util/symbol.h"
#include "util/debug.h"
#include "util/machine.h"
#include "tests.h"
/*
* This test is to check whether a bad symbol in a module won't split kallsyms maps.
* The main_symbol[1-3] should belong to the main [kernel.kallsyms] map even if the
* bad_symbol from the module is found in the middle.
*/
static char root_template[] = "/tmp/perf-test.XXXXXX";
static char *root_dir;
static const char proc_version[] = "Linux version X.Y.Z (just for perf test)\n";
static const char proc_modules[] = "module 4096 1 - Live 0xffffffffcd000000\n";
static const char proc_kallsyms[] =
"ffffffffab200000 T _stext\n"
"ffffffffab200010 T good_symbol\n"
"ffffffffab200020 t bad_symbol\n"
"ffffffffab200030 t main_symbol1\n"
"ffffffffab200040 t main_symbol2\n"
"ffffffffab200050 t main_symbol3\n"
"ffffffffab200060 T _etext\n"
"ffffffffcd000000 T start_module\t[module]\n"
"ffffffffab200020 u bad_symbol\t[module]\n"
"ffffffffcd000040 T end_module\t[module]\n";
static struct {
const char *name;
const char *contents;
long len;
} proc_files[] = {
{ "version", proc_version, sizeof(proc_version) - 1 },
{ "modules", proc_modules, sizeof(proc_modules) - 1 },
{ "kallsyms", proc_kallsyms, sizeof(proc_kallsyms) - 1 },
};
static void remove_proc_dir(int sig __maybe_unused)
{
char buf[128];
if (root_dir == NULL)
return;
for (unsigned i = 0; i < ARRAY_SIZE(proc_files); i++) {
scnprintf(buf, sizeof(buf), "%s/proc/%s", root_dir, proc_files[i].name);
remove(buf);
}
scnprintf(buf, sizeof(buf), "%s/proc", root_dir);
rmdir(buf);
rmdir(root_dir);
root_dir = NULL;
}
static int create_proc_dir(void)
{
char buf[128];
root_dir = mkdtemp(root_template);
if (root_dir == NULL)
return -1;
scnprintf(buf, sizeof(buf), "%s/proc", root_dir);
if (mkdir(buf, 0700) < 0)
goto err;
for (unsigned i = 0; i < ARRAY_SIZE(proc_files); i++) {
int fd, len;
scnprintf(buf, sizeof(buf), "%s/proc/%s", root_dir, proc_files[i].name);
fd = open(buf, O_RDWR | O_CREAT, 0600);
if (fd < 0)
goto err;
len = write(fd, proc_files[i].contents, proc_files[i].len);
close(fd);
if (len != proc_files[i].len)
goto err;
}
return 0;
Annotation
- Immediate include surface: `linux/compiler.h`, `fcntl.h`, `signal.h`, `unistd.h`, `sys/stat.h`, `util/dso.h`, `util/map.h`, `util/symbol.h`.
- Detected declarations: `function remove_proc_dir`, `function create_proc_dir`, `function test__kallsyms_split`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.