标签: rvds

为什么有些编译器优化if(a> 0)而不是if(*(&a)> 0)?

假设我已在全球范围内宣布:

const int a =0x93191;
Run Code Online (Sandbox Code Playgroud)

在主要功能中我有以下条件:

if(a>0)
    do_something
Run Code Online (Sandbox Code Playgroud)

我注意到的一个尴尬是RVDS编译器将删除该if语句,并且目标文件中没有branch/jmp.

如果我写:

if(*(&a)>0)
    do_something
Run Code Online (Sandbox Code Playgroud)

if(cmpbranch)将在编译的目标文件中.


相反,GCC 用(-O1-O2-O3)优化两者:

#include <stdio.h>
const a = 3333;

int main()
{
    if (a >333)
        printf("first\n");

return 0;
}
Run Code Online (Sandbox Code Playgroud)

用-O3编译:

(gdb) disassemble main
Dump of assembler code for function main:
0x0000000100000f10 <main+0>:    push   %rbp
0x0000000100000f11 <main+1>:    mov    %rsp,%rbp
0x0000000100000f14 <main+4>:    lea    0x3d(%rip),%rdi        # 0x100000f58
0x0000000100000f1b <main+11>:   callq  0x100000f2a <dyld_stub_puts>
0x0000000100000f20 <main+16>:   xor …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction optimization rvds

8
推荐指数
2
解决办法
347
查看次数

在发布版本中删除调试字符串

我使用一个LOG_DEBUG函数将调试信息打印到屏幕上.我使用a #define _DEBUGLOG_DEBUG通过_DEBUG在编译时(发布时间)定义FLAG 来禁用函数.但strings发布版本应用程序的linux 命令仍然显示编译应用程序中存在的调试字符串.那么消除争论的替代方法是LOG_DEBUG什么?

#ifdef _DEBUG
#define LOG_DEBUG(fmt, ...) printf("[D][%s:%d %s]", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#else
#define LOG_DEBUG(fmt, ...)
#endif


LOG_DEBUG("this is a debug string");     // "this is a debug string" exists in app release build yet
Run Code Online (Sandbox Code Playgroud)

我使用的编译器: ARM/Thumb C/C++ Compiler, RVCT3.1 [Build 569]

优化: -O3

c debugging release rvds armcc

6
推荐指数
1
解决办法
88
查看次数

如何从共享库中导出符号

我使用Windows Host上的RVDS编译器*.so使用*.o目标代码文件(C源代码)创建了一个共享库().

我将此共享对象与应用程序(gcc在Linux主机上用于ARM目标)链接并获取可执行文件,该文件在运行时会生成分段错误.(我知道我必须调试它!)

如果我创建一个具有相同源文件的静态库,然后与应用程序链接,然后执行应用程序,它可以正常工作,而不是创建共享库.

所以我的问题是:

  1. 我是否需要使用某些结构在源文件中显式导出符号(导出到应用程序的函数)或任何其他符号,以便在与应用程序链接时正常工作?需要什么,我该怎么做?

  2. 共享库如何工作?即,在创建库时,将在库中给出将加载和运行函数的地址.application(main())如何解析要执行库函数的地址?

  3. 静态库如何工作,即如何在静态库的情况下解决规范和解决问题?

linux arm shared-libraries cross-compiling rvds

5
推荐指数
1
解决办法
3万
查看次数