binmiscctl(8) (and imgact_binmisc kernel module)
Stacey Son
sson at FreeBSD.org
Wed May 22 22:17:38 UTC 2013
Hi all:
I added a command-line utility called 'binmiscctl' for the imgact_binmisc kernel module that I previously proposed on this list. As you may recall, imgact_binmisc is an image activator for miscellaneous binary file types that are executed with the help of a user-level interpreter or emulator. It has been proposed that imgact_binmisc be added to the kernel as a module. The main reason I created this is to support cross building packages using qemu user mode (see my dev summit slides at http://people.freebsd.org/~sson/imgact_binmisc/20130515-bsdcan-xbuild-ports.pdf) but there are a lot of other applications for this module as well. For example, Nathan Whitehorn previously proposed on this list a similar code change (but much less general) to support transparently execute LLVM bitcode using the 'lli' JIT compiler. This kernel module if flexible enough that it supports that as well.
Baptiste has also added support in poudrière for cross-building mips64 packages in a "cross jail" using qemu user mode. See his slides from BSDCan 2013 (pg. 7):
http://people.freebsd.org/~bapt/modern-package-management.pdf
Bapt mentioned that he built over 10,000 mips64 packages in about 30 hours. Of course, this is before adding imgact_binmisc which greatly improves the cross build speed by allowing both native (amd64) cross build tools to be used along with emulated mips64 binaries in a hybrid fashion. With my limited testing of cross building a handful of ports the overhead compared to building the port natively on a commodity amd64 host is 2x to 4x using this kernel module. Without the module the overhead is 10x or much more.
The recently added 'binmiscctl' command-line utility allows for easy configuration and management of the image activators in this imgact_binmisc kernel module. For example, to add an image activator for qemu-mips64 (the qemu user mode emulator for mips64):
# binmiscctl add mips64elf --interpreter "/usr/local/bin/qemu-mips64" --magic \ "\x7f\x45\x4c\x46\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" --size 20 --set-enabled
To disable the above without removing it from the module's activator list:
# binmiscctl disable mips64elf
To enable:
# binmiscctl enable mips64elf
To remove from the module's activator list:
# binmiscctl remove mips64elf
To lookup and print out the activator entry:
# binmiscctl lookup mips64elf
name: mips64elf
interpreter: /usr/local/bin/qemu-mips64
flags: ENABLED USE_MASK
magic size: 20
magic offset: 0
magic: 0x7f 0x45 0x4c 0x46 0x02 0x02 0x01 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x08
mask: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0xff 0xff 0xff 0xff
0xff 0xff 0xff 0xff 0xff 0xfe 0xff 0xff
To take a snapshot and list all the activators
# binmiscctl list
name: mips64elf
[...]
To add an image activator for LLVM bitcode JIT lli(1) compiler:
# binmiscctl add llvmbc --interpreter ''/usr/bin/lli --fake-argv0=#a'' \
--magic ''BC\xc0\xde'' --size 4 --set-enabled
Note the "#a", in the above example, is replaced with the old argv0 value so lli(1) can use it to fake the argv0 as described in the lli(1) man page.
The source code, man page, and diff to add it to the source tree can be found at:
http://people.freebsd.org/~sson/imgact_binmisc/
Of course, comments, suggestions, concerns, detailed code reviews, etc. are welcome.
Best Regards,
-stacey.
More information about the freebsd-arch
mailing list