Home | History | Annotate | Download | only in strace
      1 Each strace port relies heavily on port-specific headers:
      2 	- errnoent.h - map error number to error name like strerror()
      3 	- ioctlent.h - map ioctl number to symbolic define
      4 	- signalent.h - map signal number to signal name like strsignal()
      5 	- syscallent.h - map syscall number to name and function signature
      6 
      7 Since generating these headers from scratch (or even just updating them) can be
      8 a big pain, there are a few scripts to help automate the process.  Since each
      9 port organizes their kernel sources differently, there may be a specific script
     10 for your kernel.
     11 
     12 We will use the Linux kernel (2.6.20+) as an example below (the Blackfin
     13 architecture to be specific).  Hopefully, it'll be obvious how to swap out a
     14 different system or architecture as your circumstances apply.
     15 
     16 ksrc=/usr/src/linux
     17 asrc=$ksrc/arch/blackfin/include/asm
     18 
     19 To use the errnoent.sh script, give it all the headers that might contain
     20 appropriate errno values.  Excessive headers are not a problem.  The resulting
     21 output should be directly usable without modification.
     22 	sh ./errnoent.sh \
     23 		$ksrc/include/linux/*errno*.h \
     24 		$ksrc/include/asm-generic/*errno*.h \
     25 		$asrc/*errno*.h \
     26 		> errnoent.h
     27 
     28 To use the ioctlent.sh script, give it all the base include directories.  The
     29 script will crawl all the headers and try to discover appropriate ioctls.
     30 Unlike the other scripts, this one creates files for further processing.  This
     31 is because ioctls tend to have a lot of define indirection, and the ioctlent.h
     32 header needs to be fully expanded into numeric form and sorted properly.  So
     33 first we process all of the ioctls with the ioctlent.sh into ioctldefs.h and
     34 ioctls.h, and then we compile them into ioctlsort.c.  The resulting output,
     35 while directly usable, only contains definitions that match exactly the current
     36 kernel version that the script ran against.  That means older/newer ioctl
     37 defines that might be present in the existing ioctlent.h header will be lost if
     38 things are copied directly.  A little creative use of `diff` and manual merging
     39 should be used to produce the final ioctlent.h header.
     40 	sh ./linux/ioctlent.sh $ksrc/include $asrc
     41 	gcc -Wall -I. linux/ioctlsort.c -o ioctlsort
     42 	./ioctlsort > ioctlent.h
     43 
     44 To use the signalent.sh script, give it all the headers that might contain
     45 appropriate signal values.  Excessive headers are not a problem.  The resulting
     46 output should be directly usable without modification.
     47 	sh ./signalent.sh \
     48 		$asrc/signal.h \
     49 		> signalent.h
     50 
     51 To use the syscallent.sh script, give it the header with the list of your
     52 system call numbers.  The resulting output is useful as a template for creating
     53 a proper header as it can really only detect the system call number and its
     54 name.  It has no way of knowing the number of arguments or strace flags for
     55 decoding them (yet?).
     56 	sh ./syscallent.sh \
     57 		$asrc/unistd.h \
     58 		> syscallent.h
     59