From af271f68d4c631ab11ec4b47e5cbbad0a1e635b4 Mon Sep 17 00:00:00 2001 From: "Mark A. Yoder" <Mark.A.Yoder@Rose-Hulman.edu> Date: Wed, 5 Jul 2023 17:50:11 -0400 Subject: [PATCH] Updated Cross Compiling --- books/beaglebone-cookbook/07kernel/kernel.rst | 152 ++++++------------ 1 file changed, 50 insertions(+), 102 deletions(-) diff --git a/books/beaglebone-cookbook/07kernel/kernel.rst b/books/beaglebone-cookbook/07kernel/kernel.rst index 41288543..5f76ac16 100644 --- a/books/beaglebone-cookbook/07kernel/kernel.rst +++ b/books/beaglebone-cookbook/07kernel/kernel.rst @@ -265,14 +265,18 @@ To download and compile the kernel, follow these steps: .. note:: If you are using a 64 bit Bone, **git checkout ti-linux-arm64-5.10.y** -1. The first command clones a repository with the tools to build the kernel for the Bone. -2. When you know which kernel to try, use *git checkout* to check it out. - This command checks out branch *ti-linux-5.10.y*. -3. *build_deb.sh* is the master builder. If needed, it will download the cross compilers - needed to compile the kernel (`gcc <https://gcc.gnu.org/>`_ is the current cross compiler). - If there is a kernel at ``~/linux-dev``, it will use it; otherwise, - it will download a copy to ``ti-linux-kernel-dev/ignore/linux-src``. - It will then patch the kernel so that it will run on the Bone. +.. annotations:: + + <1> The first command clones a repository with the tools to build the kernel for the Bone. + + <2> When you know which kernel to try, use *git checkout* to check it out. + This command checks out branch *ti-linux-5.10.y*. + + <3> *build_deb.sh* is the master builder. If needed, it will download the cross compilers + needed to compile the kernel (`gcc <https://gcc.gnu.org/>`_ is the current cross compiler). + If there is a kernel at ``~/linux-dev``, it will use it; otherwise, + it will download a copy to ``ti-linux-kernel-dev/ignore/linux-src``. + It will then patch the kernel so that it will run on the Bone. .. note:: *build_deb.sh* may ask you to install additional files. Just run **sudo apt install *files*** to @@ -392,116 +396,58 @@ Reboot and test out the new kernel. .. _kernel_using_cross_compiler: -Using the Installed Cross Compiler -=================================== - -.. todo - This should be removed +Installin a Cross Compiler +========================== Problem -------- -You have followed the instructions in :ref:`kernel_compiling` -and want to use the cross compiler it has downloaded. - -.. tip:: - You can cross-compile without installing the - entire kernel source by running the following: - - .. code-block:: bash - - host$ sudo apt install gcc-arm-linux-gnueabihf - - -Then skip down to :ref:`kernel_skip_to_here`. - +You want to compile on your host computer and run on the Beagle. Solution --------- -:ref:`kernel_compiling` installs a cross compiler, but you need to set up a -couple of things so that it can be found. :ref:`kernel_compiling` installed the -kernel and other tools in a directory called ``ti-linux-kernel-dev``. Run the -following commands to find the path to the cross compiler: - -.. code-block:: bash - - host$ cd ti-linux-kernel-dev/dl - host$ ls - gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux - gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux.tar.xz - - -Here, the path to the cross compiler contains the version number -of the compiler. Yours might be different from mine. *cd* into it: - -.. code-block:: bash - - host$ cd gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux - host$ ls - 20130415-gcc-linaro-arm-linux-gnueabihf bin libexec - arm-linux-gnueabihf lib share - - -At this point, we are interested in what's in ``bin``: - -.. code-block:: bash - - host$ cd bin - host$ ls - arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gfortran - arm-linux-gnueabihf-ar arm-linux-gnueabihf-gprof - arm-linux-gnueabihf-as arm-linux-gnueabihf-ld - arm-linux-gnueabihf-c+* arm-linux-gnueabihf-ld.bfd - arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-ldd - arm-linux-gnueabihf-cpp arm-linux-gnueabihf-ld.gold - arm-linux-gnueabihf-ct-ng.config arm-linux-gnueabihf-nm - arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-objcopy - arm-linux-gnueabihf-g+* arm-linux-gnueabihf-objdump - arm-linux-gnueabihf-gcc arm-linux-gnueabihf-pkg-config - arm-linux-gnueabihf-gcc-4.7.3 arm-linux-gnueabihf-pkg-config-real - arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ranlib - arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-readelf - arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-size - arm-linux-gnueabihf-gcov arm-linux-gnueabihf-strings - arm-linux-gnueabihf-gdb arm-linux-gnueabihf-strip - - -What you see are all the cross-development tools. You need to add this directory -to the *$PATH* the shell uses to find the commands it runs: +Run the following: -.. code-block:: bash +.. tabs:: - host$ pwd - /home/yoder/BeagleBoard/ti-linux-kernel-dev/dl/\ - gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin - - host$ echo $PATH - /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\ - /usr/games:/usr/local/games + .. group-tab:: 32-bit + .. code-block:: bash -The first command displays the path to the directory where the cross-development -tools are located. The second shows which directories are searched to find commands -to be run. Currently, the cross-development tools are not in the *$PATH*. Let's add it: + host$ sudo apt install gcc-arm-linux-gnueabihf -.. code-block:: bash + .. group-tab:: 64-bit - host$ export PATH=`pwd`:$PATH - host$ echo $PATH - /home/yoder/BeagleBoard/ti-linux-kernel-dev/dl/\ - gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin:\ - /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\ - /usr/games:/usr/local/games + .. code-block:: bash + host$ sudo apt install gcc-aarch64-linux-gnu .. note:: - Those are backtick characters (left of the "1" key on your keyboard) around *pwd*. + From now on use **arm** if you are using a 32-bit machine and + **aarch64** if you are using a 64-bit machine. +This installs a cross compiler, but you need to set up a +couple of things so that it can be found. At the command prompt, +enter **arm-<TAB><TAB>** to see what was installed. -The second line shows the *$PATH* now contains the directory with the cross-development tools. +.. code-block:: bash -.. _kernel_skip_to_here: + host$ arm-<TAB><TAB> + arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-ld.bfd + arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-nm-11 arm-linux-gnueabihf-ld.gold + arm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-lto-dump-11 + arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc-ranlib-11 arm-linux-gnueabihf-nm + arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov arm-linux-gnueabihf-objcopy + arm-linux-gnueabihf-cpp-11 arm-linux-gnueabihf-gcov-11 arm-linux-gnueabihf-objdump + arm-linux-gnueabihf-dwp arm-linux-gnueabihf-gcov-dump arm-linux-gnueabihf-ranlib + arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gcov-dump-11 arm-linux-gnueabihf-readelf + arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcov-tool arm-linux-gnueabihf-size + arm-linux-gnueabihf-gcc-11 arm-linux-gnueabihf-gcov-tool-11 arm-linux-gnueabihf-strings + arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-gprof arm-linux-gnueabihf-strip + arm-linux-gnueabihf-gcc-ar-11 arm-linux-gnueabihf-ld + +What you see are all the cross-development tools. Setting Up Variables ===================== @@ -513,15 +459,15 @@ Now, set up a couple of variables to know which compiler you are using: host$ export ARCH=arm host$ export CROSS_COMPILE=arm-linux-gnueabihf- - These lines set up the standard environmental variables so that you can determine which cross-development tools to use. Test the cross compiler by adding :ref:`kernel_helloWorld` to a file named _helloWorld.c_. .. _kernel_helloWorld: .. literalinclude:: ../code/07kernel/helloWorld.c - :caption: Simple helloWorld.c to test cross compiling (helloWorld.c) - :linenos: + :language: c + :caption: Simple helloWorld.c to test cross compiling (helloWorld.c) + :linenos: :download:`helloWorld.c <../code/07kernel/helloWorld.c>` @@ -535,9 +481,11 @@ You can then cross-compile by using the following commands: dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0x10182364352b9f3cb15d1aa61395aeede11a52ad, not stripped - The *file* command shows that *a.out* was compiled for an ARM processor. +.. todo + Need to install libc. + .. _kernel_patches: Applying Patches -- GitLab