相关疑难解决方法(0)

如何用GCC和ld删除未使用的C/C++符号?

我需要严格优化可执行文件的大小(ARM开发),我注意到在我当前的构建方案(gcc+ ld)中,未使用的符号不会被剥离.

的用法arm-strip --strip-unneeded为生成的可执行文件/库不改变可执行文件的输出大小(我不知道为什么,也许它根本不能).

修改我的构建管道的方式是什么(如果存在),以便从结果文件中删除未使用的符号?


我甚至都不会想到这一点,但我当前的嵌入式环境并不是非常"强大",甚至500K可以节省2M非常好的加载性能.

更新:

不幸的是,gcc我使用的当前版本没有-dead-strip选项,并且-ffunction-sections... + --gc-sectionsfor ld不会对结果输出产生任何显着差异.

我很震惊,这甚至成了问题,因为我确信gcc + ld应该自动删除未使用的符号(为什么他们甚至要保留它们?).

c c++ gcc strip ld

107
推荐指数
10
解决办法
10万
查看次数

如何使用没有Glibc的C中的内联汇编来获取参数值?

如何使用没有Glibc的C中的内联汇编来获取参数值?

我需要这个代码用于Linuxarchecture x86_64i386.如果你知道MAC OS X或者Windows,也提交并请指导.

void exit(int code)
{
    //This function not important!
    //...
}
void _start()
{
    //How Get arguments value using inline assembly
    //in C without Glibc?
    //argc
    //argv
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

新的更新

https://gist.github.com/apsun/deccca33244471c1849d29cc6bb5c78e

#define ReadRdi(To) asm("movq %%rdi,%0" : "=r"(To));
#define ReadRsi(To) asm("movq %%rsi,%0" : "=r"(To));
long argcL;
long argvL;
ReadRdi(argcL);
ReadRsi(argvL);
int argc = (int) argcL;
//char **argv = (char **) argvL;
exit(argc);
Run Code Online (Sandbox Code Playgroud)

但它仍然返回0.所以这段代码错了!请帮忙.

c assembly x86-64 i386

2
推荐指数
3
解决办法
624
查看次数

标签 统计

c ×2

assembly ×1

c++ ×1

gcc ×1

i386 ×1

ld ×1

strip ×1

x86-64 ×1