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>
- ADS转RVDS invalid call from '~PRES8' function to 'REQ8' function
- ADS转RVDS invalid call from '~PRES8' function to 'REQ8' function
- ADS转Keil中 invalid call from '~PRES8' function to 'REQ8' 错误解决之道
- ADS 转Keil, ADS升级至MDK常见错误 invalid call from '~PRES8' function to 'REQ8' 解决方法
- Error armlink L6238 Startup.o(Start) contains invalid call from '~PRES8' function to 'REQ8' functio
- How to call function from register view
- contains invalid call from '~PRES8 (The user did n......
- How to call an external C function from within Oracle
- call lua function from c and called back to c
- Call to undefined function mysql_connect()【转】
- test.axf: Error: L6238E: cpu_asm.o(test) contains invalid call from '~PRES8
- ambiguous call to overloaded function
- Call to undefined function mysql_create_db()
- Call to undefined function: mcrypt_module_open()
- Call to undefined function: mcrypt_module_open()
- Call to undefined function: mysql_connect()
- Call to undefined function mysql_connect()
- 解决Call to undefined function
- memcached&redis等分布式缓存的实现原理
- visi20安装教程
- RxJava 的操作符
- hibernate基础(三)——主键生成策略与flush缓存清理
- Android 应用启动速度优化
- ADS转RVDS invalid call from '~PRES8' function to 'REQ8' function
- Android Studio 关于so文件导入的若干方案
- mysql存储引擎
- jQuery使用笔记
- Android沉浸式状态栏SystemBarTint的使用方法
- 蓝光安装算量软件下载 v2.9
- android界开发如何禁止密码输入框复制粘贴
- 使用FreeMarker邮件模版来发送邮件
- 探索C++内存模型(中)