注意:
The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.
Frankenchroot/Manual Binary Format Setup
< Frankenchroot
Jump to navigation
Jump to search
Revision as of 00:48, July 13, 2020 by Necrose99 (talk | contribs) (→Setting up binfmt_misc and Starting the Service RISCV64)
Warning
This page is for advanced users and reference only. It is recommended that you use the Binary Format Setup steps as this automates this process for you and makes things tremendously easier.
Building and Installing the Wrapper Binary
qemu-arm-wrapper.c
(C source code) - qemu arm wrapper/*
* Call QEMU binary with additional "-cpu cortex-a7" argument.
*
* Copyright (c) 2018 sakaki <sakaki@deciban.com>
* License: GPL v3.0+
*
* Based on code from the Gentoo Embedded Handbook
* ("General/Compiling_with_qemu_user_chroot")
*/
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv, char **envp) {
char *newargv[argc + 3];
newargv[0] = argv[0];
newargv[1] = "-cpu";
newargv[2] = "cortex-a7";
memcpy(&newargv[3], &argv[1], sizeof(*argv) * (argc -1));
newargv[argc + 2] = NULL;
return execve("/usr/local/bin/qemu-arm", newargv, envp);
}
root # gcc -static -O3 -s -o qemu-arm-wrapper qemu-arm-wrapper.c
root # cp -av /usr/bin/qemu-arm /mnt/piroot/usr/local/bin/qemu-arm root # cp -av qemu-arm-wrapper /mnt/piroot/usr/local/bin/qemu-arm-wrapper
Setting up binfmt_misc and Starting the Service
root # echo ":arm:M::\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-arm-wrapper:" > /proc/sys/fs/binfmt_misc/register
Setting up binfmt_misc and Starting the Service ARM64
root # echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64:' > /proc/sys/fs/binfmt_misc/register
Setting up binfmt_misc and Starting the Service RISCV64
root # echo ':riscv64:M::\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-riscv64:' > /proc/sys/fs/binfmt_misc/register
notes from https://wiki.debian.org/RISC-V#Qemu
root # rc-service binfmt restart
root # rc-service binfmt status
Warning
The preceding wrapper and binfmt_misc register string were for arm 32bit. They *MUST* be edited for aarch64.
Tip
The following code will create the binfmt_misc register string for the arch you are emulating in usermode Qemu. This is only needed for targets other than the arm target already packaged for you above. Usage is as followed:
root # chmod +x masky root # masky /path/to/foreign/binary
- Paste the output to /proc/sys/fs/binfmt_misc/register
- Change "arm" in the following code to whatever you want the name of the binfmt_misc name to be when it is registered
- Change /usr/local/bin/qemu-arm-wrapper to the name of your wrapper
masky
(python source code) - masky#!/usr/bin/python3
import sys
import struct
import string
import codecs
printable_chars = set(string.printable)
printable_chars = set()
def print_out_hexstring(hexstring):
to_process = hexstring
while len(to_process):
ascii_value = chr(int(to_process[:2], 16))
to_process = to_process[2:]
if ascii_value in printable_chars:
sys.stdout.write(ascii_value)
else:
sys.stdout.write("\\x" + "{0:02x}".format(ord(ascii_value)))
chunk_as_hexstring = ""
with open(sys.argv[1], 'rb') as f:
for x in range(0,19):
chunk_as_hexstring += f.read(1).hex()
mask_as_hexstring = "fffffffffffffffcfffffffffffffffffeffff"
mask = int(mask_as_hexstring, 16)
chunk = int(chunk_as_hexstring, 16)
out_as_hexstring = hex(chunk & mask)[2:]
sys.stdout.write(":arm:M::")
print_out_hexstring(out_as_hexstring)
sys.stdout.write(":")
print_out_hexstring(mask_as_hexstring)
sys.stdout.write(":/usr/local/bin/qemu-arm-wrapper:\n")