Forth Bridge is the fourth full-system preview release of Infinity. Forth Bridge showcases low-level Python bindings for libi8x, which are used by the note tester [I8X] and the note compiler's testsuite. Forth Bridge will be released July 10, 2017.
- 1 Changes since Infinity Third Eye
- 2 Building Infinity Forth Bridge
- 3 Things to do with Infinity Forth Bridge
Changes since Infinity Third Eye
- libi8x now has low-level Python bindings (to be supplemented by a high-level layer in a future release.)
- The relocation interface has changed.
- Userdata is now immutable once set.
- A number of bugs in the LEB128 decoders and function unregistration are now fixed.
- A number of previously-internal functions are now public.
- A new error code
I8X_NATCALL_FAILEDhas been introduced.
- I8X now uses libi8x to execute Infinity functions if libi8x and its Python bindings are installed.
- Infinity functions provided by testcases must now be identified using the
- The function
TestCase.implementhas been removed.
- The interpreter context is no longer accessible as
TestCase.i8ctx. Infinity functions should now be executed using
- All testcases have been updated to use
Building Infinity Forth Bridge
Note that there's presently no PIP package for the libi8x Python bindings, so for this release you'll have to build them from source. Note also that the order of things has changed for this release, it's necessary to build libi8x before I8C in order to use the new interpreter for the glibc build step.
Build libi8x with the shim libthread_db
To build libi8x with the shim libthread_db you first need to install the elfutils libelf development files. For Fedora and RHEL this is the
elfutils-libelf-devel RPM. For Debian and Ubuntu the package you need is
libelf-dev. Either way, once done you should see
/usr/include/libelf.h on your system.
Once that's there, clone and build libi8x:
git clone https://gitlab.com/gbenson/libi8x.git cd libi8x git branch forth-bridge infinity-forth-bridge git checkout forth-bridge ./autogen.sh ./configure make make check # optional
You should see an
examples/libthread_db.so.1 symbolic link if it worked.
Build libi8x Python bindings
Now you need to build and install the Python bindings that the note compiler needs.
You need to have py3c installed for this, and for this development snapshot you need pycparser too.
On RHEL and Fedora you can install both with
sudo dnf install py3c-devel python-pycparser.
If someone tells me the details for Debian/Ubuntu I'll put those in here too.
cd python python setup.py test # optional python setup.py install --user
You should be able to execute
import _libi8x in Python without error if this step worked.
Note that for this release the Python bindings statically link libi8x; there's no need to
make install libi8x.
Note that one test fails on 32-bit machines:
FAIL: test_set (tests.lo.test_py8x_inf_set_relocate_fn.TestPy8xInfSetRelocateFn) Test relocation when a user relocation function is set.
This is a known issue that will be fixed in the next release.
The note compiler must be built from source for this release:
git clone https://gitlab.com/gbenson/i8c.git cd i8c git branch forth-bridge infinity-forth-bridge git checkout forth-bridge python setup.py test # optional python setup.py install --user
You should see
using libi8x interpreter (experimental) near the top of the
python setup.py test output if the libi8x bindings were successfully installed.
Create a test build of glibc with Infinity notes
i8c needs to be in your path before you continue. If you're following this guide it'll be in
~/.local/bin/i8c, so you may need to add
~/.local/bin to your path. Alternatively you can omit the
--user and install I8C globally on your system. However you install it, you need to be able to enter this exact command:
i8c --version | head -n 1
and see this exact output:
Once you have I8C installed you can proceed to build glibc:
mkdir -p glibc/build git clone https://gitlab.com/gbenson/glibc.git glibc/src cd glibc/src git branch forth-bridge infinity-forth-bridge git checkout forth-bridge cd ../build ../src/configure --prefix=/usr --with-infinity make
--with-infinity is assumed if you have I8C installed, but specifiying it explicitly here forces
configure to check the version for you.
You should be able to see Infinity notes in libpthread.so and ld.so if everything worked. Both
readelf -n nptl/libpthread.so readelf -n elf/ld.so
should list several notes with owner "GNU" and unknown type 0x2323:
Displaying notes found at file offset 0x0002144c with length 0x00000378: Owner Data size Description GNU 0x0000006d Unknown note type: (0x00002323) GNU 0x0000007d Unknown note type: (0x00002323) GNU 0x000000cc Unknown note type: (0x00002323) GNU 0x0000009f Unknown note type: (0x00002323) GNU 0x0000005f Unknown note type: (0x00002323) GNU 0x0000005b Unknown note type: (0x00002323)
See https://sourceware.org/glibc/wiki/Testing/Builds for more information about glibc test builds.
Things to do with Infinity Forth Bridge
Run the note tester on the glibc you built
The note tester I8X is hooked into glibc's
make check, but lets run it directly:
cd /path/to/glibc/build i8x -I. -i nptl/libpthread.so ../src/nptl/tst-infinity-*.py
You should see some output as to the result of the tests, and all tests should pass. You should see
using libi8x interpreter (experimental) near the top of the output if the libi8x bindings were successfully installed. If you see
using Python interpreter (deprecated) then something went wrong.
To run with glibc's make check, try this:
cd /path/to/glibc/build make subdirs=nptl check
I8X's output will be in
nptl/tst-infinity.out, and the result that glibc's make check consumes will be in
nptl/tst-infinity.test-result. Again, you should see
using libi8x interpreter (experimental) near the top of I8X's output.
There's no GDB-specific changes in this release, but GDB things from previous releases are still relevant. See: