ADS转RVDS invalid call from '~PRES8' function to 'REQ8' function

来源:互联网 发布:淘宝照片找同款 编辑:程序博客网 时间:2024/05/22 15:42

把ADS的文件放到RVDS2.2的工程里,make时出现invalid call from '~PRES8' function to 'REQ8'...

google加ARM网站,找到一段解释:

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.

  • PRES8 means the object PREServes 8-byte alignment of the stack.
  • ~PRES8 means the object does NOT preserve 8-byte alignment of the stack (~ meaning NOT).
  • REQ8 means the object REQuires 8-byte alignment of the stack.

This link error typically occurs in two cases:

  • where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and
  • when attempting to link legacy SDT/ADS objects with RVCT 2.x objects. Legacy SDT/ADS objects that do not have these attributes are treated as '~PRES8', even if they do actually happen to preserve 8-byte alignment.

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:

i) check that all instructions preserve 8-byte stack alignment, and if necessary, correct them.
e.g. change:

<span style="font-family: SimSun; font-size: 18px;">        STMFD sp!, {r0-r3, lr} ; push an odd number of registers </span>

to:

<span style="font-family: SimSun; font-size: 18px;">        STMFD sp!, {r0-r3, r12, lr} ; push an even number of registers </span>

and:

ii) add the PRESERVE8 directive to the top of each assembler file.
e.g. change:

<span style="font-family: SimSun; font-size: 18px;">        AREA Init, CODE, READONLY </span>

to:

<span style="font-family: SimSun; font-size: 18px;">        PRESERVE8        AREA Init, CODE, READONLY </span>

(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 (e.g. 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 RVCT 2.0 ?".


我对这个问题的解决如下:

在我的文件中加入了

<span style="font-family: SimSun; font-size: 18px;">PRESERVE8</span>
<span style="font-family: SimSun; font-size: 18px;"></span><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: SimSun; font-size: 18px;">e.g. change:</span></p><pre class="sourecode" name="code" style="white-space: pre-wrap; word-wrap: break-word; background-color: rgb(255, 255, 255);"><span style="font-family: SimSun; font-size: 18px;">        AREA Init, CODE, READONLY </span>

to:

<span style="font-family: SimSun; font-size: 18px;">        PRESERVE8        AREA Init, CODE, READONLY</span>

0 0