ARM Technical Support Knowledge Articles

Linker Error: L6238E: foo.o(.text) contains invalid call from '~PRES8' function to 'REQ8' function foobar

Applies to: RealView Developer Kit (RVDK) for OKI, RealView Development Suite (RVDS)

This RVDS/RVCT linker error is given where a stack alignment conflict is detected in object code. The "ABI for the ARM Architecture" demands that code maintains 8-byte stack alignment at its interfaces. This allows efficient use of LDRD and STRD instructions (in ARM Architecture 5TE and later) to access 8-byte-aligned "double" and "long long" data types.

Symbols like '~PRES8' and 'REQ8' are "Build Attributes" of the objects.

This link error typically occurs in two cases:

For example:

Error: L6238E: foo.o(.text) contains invalid call from '~PRES8' function to 'REQ8' function foobar

This means that there is a function in the object foo.o (in the section named .text) that does not preserve 8-byte stack alignment, but which is trying to call function foobar that requires 8-byte stack alignment.

A similar warning that may be encountered, where the address of an external symbol is being referred to, is:

Warning: L6306W: '~PRES8' section foo.o(.text) should not use the address of 'REQ8' function foobar

Solutions:

There are two possible approaches to dealing with this issue:

  1. If you have access to all your source code and are allowed to rebuild it
    In this case you should rebuild all your objects/libraries using the latest version of the compilation tools. Note that if you have any assembler files, you will need to:

    1. check that all instructions preserve 8-byte stack alignment, and if necessary, correct them. For example, change:

          STMFD sp!, {r0-r3, lr} ; push an odd number of registers

      to:

          STMFD sp!, {r0-r3, r12, lr} ; push an even number of registers

      and:

    2. add the PRESERVE8 directive to the top of each assembler file. For example, change:

          AREA Init, CODE, READONLY

      to:

          PRESERVE8 AREA Init, CODE, READONLY

      (the PRES8 attribute applies to the whole object, not just the code section).

  2. If you cannot rebuild all of your source code
    If you have any legacy objects/libraries that cannot be rebuilt, either because you do not have the source code, or because the old objects must not be rebuilt (for example, for qualification/certification reasons), then you must inspect the legacy objects to check whether they preserve 8-byte alignment or not. Use "fromelf -c" to disassemble the object code. C/C++ code compiled with ADS 1.1 or later will normally preserve 8-byte alignment, but assembled code will not.

    If your objects do indeed preserve 8-byte alignment, then the linker error L6238E can be suppressed with the use of "--diag_suppress 6238" on the linker command line. By using this, you are effectively saying "I guarantee that these objects are PRES8". The linker warning L6306W is suppressible with "--diag_suppress 6306".

    If you are linking with legacy objects/libraries then you should also read the information on the option "--apcs /adsabi" in the FAQ entry "Are legacy ADS objects/libraries compatible with my project?".

Article last edited on: 2009-07-17 10:46:29

Rate this article

[Bad]
|
|
[Good]
Disagree? Move your mouse over the bar and click

Did you find this article helpful? Yes No

How can we improve this article?

Link to this article
Copyright © 2008-9 ARM Limited. All rights reserved. External (Open), Non-Confidential