This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re:
P.S.1 There is yet another way - very cool way - to to add a symbol to
the stap script - via /sys/kernel/debug/systemtap/<module name>/.cmd
(CTL_CHANNEL_NAME below)
This is a Python sample
def write_relocate_string(f, s, size):
f.write(s)
padding = size - len(s)
for _ in range(padding):
f.write('\x00')
def write_relocate(module_name, symbol_name, address):
STP_MODULE_NAME_LEN = 128
STP_SYMBOL_NAME_LEN = 128
with open(CTL_CHANNEL_NAME, "wb") as f:
# STAP_RELOCATE (9)
f.write(struct.pack('<I', 9))
write_relocate_string(f, module_name, STP_MODULE_NAME_LEN)
write_relocate_string(f, symbol_name, STP_SYMBOL_NAME_LEN)
f.write(struct.pack('<Q', address))
On Thu, Jul 27, 2017 at 7:20 PM, Arkady <arkady.miasnikov@gmail.com> wrote:
> P.S. Another idea is to use kernel IPC instead of function calls.
> Files, named pipes, sockets, memory mapped files - just about anything
> can do the trick.
>
> On Thu, Jul 27, 2017 at 7:03 PM, Arkady <arkady.miasnikov@gmail.com> wrote:
>> Eyal,
>>
>> Utility stap employs the kernel debug information installed in the
>> system. When you load a module command insmod does not update the
>> kernel debug info. There are simple two ways to resolve the issue
>> * Load the module, get the address of the function foo using
>> /proc/kallsyms, provide the address of the foo as an argument to the
>> STAP script.
>> * Link the module statically with the kernel and update the kernel-debuginfo
>>
>> Arkady
>>
>> On Thu, Jul 27, 2017 at 5:47 PM, Eyal Yehuda via systemtap
>> <systemtap@sourceware.org> wrote:
>>>
>>>
>>> hello
>>>
>>> The
>>> issue I am facing is of undefined symbols in system tap kernel module
>>> when trying to link to another kernel module with exported symbol
>>>
>>> please note environment setup:
>>> os: debian 9 stretch 64bit
>>> kernel version: 4.9.0-3-amd64
>>>
>>>
>>> I created the following simple systemtap script using guru mode
>>>
>>> system tap script: temp.stp
>>>
>>>
>>> %{
>>> extern int foo(void);
>>> %}
>>>
>>> function call_foo:long() %{/* pure */
>>> STAP_RETVALUE = foo();
>>> %}
>>>
>>> probe syscall.open {
>>> printf("foo() : %d\n", call_foo())
>>> }
>>>
>>>
>>>
>>>
>>> In addition to that I created the following simple kernel module with
>>> an exported symbol function to be used from inside system tap
>>> script
>>>
>>> kernel module: xxx.c
>>>
>>> #include <linux/kernel.h>
>>> #include <linux/module.h>
>>> #include <linux/printk.h>
>>>
>>> static int foo(void){
>>> pr_info("foo()\n"); return 0;
>>> }
>>> EXPORT_SYMBOL(foo);
>>>
>>> static int __init xxx_init(void){
>>> pr_info("xxx_init()\n");
>>> return 0;
>>> }
>>>
>>> static void __exit xxx_exit(void){
>>> pr_info("xxx_exit() \n");
>>> }
>>>
>>> module_init(xxx_init);
>>> module_exit(xxx_exit);
>>> MODULE_LICENSE("GPL");
>>>
>>>
>>> After compiling the kernel module and insmoding it, I run the command to compile systemtap script as follow:
>>> stap -gk -v temp.stp
>>>
>>> the compilation command result with the following error:
>>>
>>>
>>> Pass 1: parsed user script and 465 library scripts using
>>> 113912virt/46752res/6476shr/40564data kb, in 110usr/20sys/124real ms.
>>>
>>> Pass 2: analyzed script: 2 probes, 2 functions, 99 embeds, 0 globals
>>> using 165912virt/100212res/7716shr/92564data kb, in 680usr/50sys/731real
>>> ms.
>>>
>>> Pass 3: translated to C into "/tmp/stapzKUZ11/stap_1837_src.c" using
>>> 165912virt/100404res/7908shr/92564data kb, in 10usr/10sys/9real ms.
>>> WARNING: "foo" [/tmp/stapzKUZ11/stap_1837.ko] undefined!
>>> Pass 4: compiled C into "stap_1837.ko" in 1410usr/120sys/1963real ms.
>>> Pass 5: starting run.
>>> ERROR: Couldn't insert module '/tmp/stapzKUZ11/stap_1837.ko': Invalid parameters
>>> WARNING: /usr/bin/staprun exited with status: 1
>>> Pass 5: run completed in 0usr/0sys/16real ms.
>>> Pass 5: run failed. [man error::pass5]
>>> Tip: /usr/share/doc/systemtap/README.Debian should help you get started.
>>> Keeping temporary directory "/tmp/stapzKUZ11"
>>>
>>>
>>> in dmesg I can see the following lines
>>>
>>> Jul 27 03:56:14 debian9 kernel: [ 3938.166906] stap_2230: no symbol version for foo
>>> Jul 27 03:56:14 debian9 kernel: [ 3938.166908] stap_2230: Unknown symbol foo (err -22)
>>>
>>>
>>> I also checked /proc/kallsyms
>>>
>>>
>>> cat /proc/kallsyms | grep xxx
>>> ffffffffc0584000 T foo [xxx]
>>> ffffffffc0584014 t xxx_exit [xxx]
>>> ffffffffc0585030 r __ksymtab_foo [xxx]
>>> ffffffffc058506e r __kstrtab_foo [xxx]
>>> ffffffffc0585040 r __kcrctab_foo [xxx]
>>> ffffffffc0586000 d __this_module [xxx]
>>> ffffffffc0584014 t cleanup_module [xxx]
>>>
>>>
>>> Please advice
>>> 1.
>>> what should i do in addition to solve this issue as I must create an
>>> interaction between systemtap script and another kernel module
>>> 2.
>>> In case this is not feasible can u please offer another alternative to
>>> make systemtap script use another kernel module services ?
>>>
>>> Thanks eyal yehuda