59 lines
2.8 KiB
Plaintext
59 lines
2.8 KiB
Plaintext
Each strace port relies heavily on port-specific headers:
|
|
- errnoent.h - map error number to error name like strerror()
|
|
- ioctlent.h - map ioctl number to symbolic define
|
|
- signalent.h - map signal number to signal name like strsignal()
|
|
- syscallent.h - map syscall number to name and function signature
|
|
|
|
Since generating these headers from scratch (or even just updating them) can be
|
|
a big pain, there are a few scripts to help automate the process. Since each
|
|
port organizes their kernel sources differently, there may be a specific script
|
|
for your kernel.
|
|
|
|
We will use the Linux kernel (2.6.20+) as an example below (the Blackfin
|
|
architecture to be specific). Hopefully, it'll be obvious how to swap out a
|
|
different system or architecture as your circumstances apply.
|
|
|
|
ksrc=/usr/src/linux
|
|
asrc=$ksrc/arch/blackfin/include/asm
|
|
|
|
To use the errnoent.sh script, give it all the headers that might contain
|
|
appropriate errno values. Excessive headers are not a problem. The resulting
|
|
output should be directly usable without modification.
|
|
sh ./errnoent.sh \
|
|
$ksrc/include/linux/*errno*.h \
|
|
$ksrc/include/asm-generic/*errno*.h \
|
|
$asrc/*errno*.h \
|
|
> errnoent.h
|
|
|
|
To use the ioctlent.sh script, give it all the base include directories. The
|
|
script will crawl all the headers and try to discover appropriate ioctls.
|
|
Unlike the other scripts, this one creates files for further processing. This
|
|
is because ioctls tend to have a lot of define indirection, and the ioctlent.h
|
|
header needs to be fully expanded into numeric form and sorted properly. So
|
|
first we process all of the ioctls with the ioctlent.sh into ioctldefs.h and
|
|
ioctls.h, and then we compile them into ioctlsort.c. The resulting output,
|
|
while directly usable, only contains definitions that match exactly the current
|
|
kernel version that the script ran against. That means older/newer ioctl
|
|
defines that might be present in the existing ioctlent.h header will be lost if
|
|
things are copied directly. A little creative use of `diff` and manual merging
|
|
should be used to produce the final ioctlent.h header.
|
|
sh ./linux/ioctlent.sh $ksrc/include $asrc
|
|
gcc -Wall -I. linux/ioctlsort.c -o ioctlsort
|
|
./ioctlsort > ioctlent.h
|
|
|
|
To use the signalent.sh script, give it all the headers that might contain
|
|
appropriate signal values. Excessive headers are not a problem. The resulting
|
|
output should be directly usable without modification.
|
|
sh ./signalent.sh \
|
|
$asrc/signal.h \
|
|
> signalent.h
|
|
|
|
To use the syscallent.sh script, give it the header with the list of your
|
|
system call numbers. The resulting output is useful as a template for creating
|
|
a proper header as it can really only detect the system call number and its
|
|
name. It has no way of knowing the number of arguments or strace flags for
|
|
decoding them (yet?).
|
|
sh ./syscallent.sh \
|
|
$asrc/unistd.h \
|
|
> syscallent.h
|