Skip to main content
Visitor II
March 15, 2022
Question

Can't compile for Arm Cortex A7, what is going wrong?

  • March 15, 2022
  • 11 replies
  • 5336 views

Install the SDK

Simple Hello World Application

I have followed all the steps for installing the SDK and verified the environment variables for the cross compiler. I use a make file and it generates a binary. The problem is it generates a binary for x86-64 even when it is being directed to use the arm-ostl-linux-gnueabi-gcc (GCC) 9.3.0 cross compiler.

Output of file:

"gtk_hello_world: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamic                       ally linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=ac39231d6a72                       8870d0248017a6c9cd25d9f02eab, for GNU/Linux 3.2.0, not stripped"

I haven't just used gtk either, a simple printf application with stdio.h will also compile for x86-64 and not the intended cross compile target.

Output of Cross Compile target:

"echo $CC

arm-ostl-linux-gnueabi-gcc -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/home/james/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi"

I have repeated this using WSL2 and VMware Workstation Player with Ubuntu 20.04 on both. The result is the same. The simple "hello world" application will open in an Ubuntu environment but not on the discovery kit using the OpenST linux distribution.

Is there any indication of something I may have done wrong in my SDK installation? Or is there some other step I can follow to ensure I get the correct cross compilation?

    This topic has been closed for replies.

    11 replies

    Technical Moderator
    March 15, 2022

    Hello @JOSU​ ,

    Regarding the check that you already made, your SDK looks well installed and well sourced. Could you please share your Makefile ? I think the problem comes from here.

    Regards.

    Erwan.

    JOSUAuthor
    Visitor II
    March 15, 2022

    Thank you for your reply.

    I am using a Makefile similar to that given in the hello world example. It is attached.

    The relevant line when using "make":

    "$(PROG): $(SRCS)

    sudo $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)"

    Where &(CC) is:

    "echo $CC

    arm-ostl-linux-gnueabi-gcc -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/home/james/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi"

    I have tried to run compilation separately with this command, but it has issues with "-mfloat-abi=hard" telling me the processor does not have a FPU. There is no such error when using the Makefile.

    Technical Moderator
    March 15, 2022

    Ok, can we make a simple test together ? With the following files :

    helloworld.c:

    -------------------------------------------

    #include <stdio.h>

    int main ()

    {

    printf("Hello World\n");

    return 0;

    }

    ------------------------------------------

    Makefile :

    -----------------------------------------------------------------------

    PROG = helloworld

    SRCS = helloworld.c

    CLEANFILES = $(PROG)

    # Add / change option in CFLAGS and LDFLAGS

    CFLAGS += -Wall

    LDFLAGS +=

    all: $(PROG)

    $(PROG): $(SRCS)

    $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)

    clean:

    rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))

    ------------------------------------------------------------------------------

    Then if you source your SDK and make, can you tell me what you can see if you enter file helloworld ?

    Regards.

    Erwan.

    PS: Be careful, if you already compiled your program in local (x86), then you source your SDK and compile again, you need to do a make clean before, because it will not detect that there is any change.

    Technical Moderator
    March 15, 2022

    You should see something like :

    helloworld: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=ba652fd63d2b63d7c6b2df9f3fe11b32b32fa168, for GNU/Linux 3.2.0, with debug_info, not stripped

    JOSUAuthor
    Visitor II
    March 15, 2022

    The output is:

    helloworld: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=987960828f1b4a1fd35a19386512d22056a5b05d, for GNU/Linux 3.2.0, not stripped

    Compiled for x86-64, not ARM.

    And on the virtual machine that binary should not execute, but it does:

    $ ./helloworld

    Hello World

    JOSUAuthor
    Visitor II
    March 15, 2022

    Verbose output of "make" attached.

    Technical Moderator
    March 15, 2022

    Thanks for the verbose.

    Considering your first line, a simple "cc" is used to compile the application instead of the arm-ostl-linux-gnueabi-gcc -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/home/james/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi" that you should see at this place.

    However, you prove me that you can source your SDK because your "echo $CC" command works well.

    As another test, instead of using your Makefile, can you compile your application such as :

    $CC helloworld.c -o helloworld

    (Make clean before).

    Do you see any change when you proceed like this ?

    JOSUAuthor
    Visitor II
    March 15, 2022

    Using make doesn't have permissions to create a binary. The verbose output is attached and I can see the correct compiler is used for this make output. I had tried "sudo make" but this user is a new environment and is not sourced correctly and uses the x86-64 compiler. I believe this might indicate I have a Linux user permissions problem.

    Technical Moderator
    March 15, 2022

    Yes it looks like a configuration problem of your own Linux machine. The last traces you sent me are similar to what you should have.

    JOSUAuthor
    Visitor II
    March 15, 2022

    I have success:

    helloworld: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=c01e9c4baa9411f23a86dfa4ed177c73fca84f87, for GNU/Linux 3.2.0, with debug_info, not stripped

    Thank you for your help. It was a combination of directory permissions and not realising the sudo command would use an incorrectly sourced cross compiler.