Articles of gcc

执行init和fini

我刚刚读了ELF文件中的init和fini部分 ,并试了一下: #include <stdio.h> int main(){ puts("main"); return 0; } void init(){ puts("init"); } void fini(){ puts("fini"); } 如果我执行gcc -Wl,-init,init -Wl,-fini,fini foo.c并运行结果,则不会打印“init”部分: $ ./a.out main fini init部分没有运行,还是无法打印? 有没有关于init / fini的任何“官方”文档? man ld说: -init=name When creating an ELF executable or shared object, call NAME when the executable or shared object is loaded, by setting DT_INIT to […]

我怎样才能编译汇编与gcc

我如何编译到程序集而不是使用gcc的可执行文件。 我知道有一个-S标志,但是我在哪里可以在makefile中使用它。 例如,如果我使用标志-O3 -o exe_name ,我应该在哪里放置-S标志?

安装PCRE时出错

我试图在我的Ubuntu 11.10服务器上安装PCRE。 当我运行“make”命令时,我得到一个非常长的输出,总是以这个错误结束: libtool: link: ( cd ".libs" && rm -f "libpcreposix.la" && ln -s "../libpcreposix.la" "libpcreposix.la" ) source='pcrecpp.cc' object='pcrecpp.lo' libtool=yes \ DEPDIR=.deps depmode=none /bin/bash ./depcomp \ /bin/bash ./libtool –tag=CXX –mode=compile -DHAVE_CONFIG_H -I. -c -o pcrecpp.lo pcrecpp.cc libtool: compile: unrecognized option `-DHAVE_CONFIG_H' libtool: compile: Try `libtool –help' for more information. make[1]: *** [pcrecpp.lo] Error 1 […]

Eclipse CDT内build包含目录

下 Eclipse CDT > Project Settings > C/C++ General > Paths and Symbols > Includes > GNU C++ 有一个包含path的列表。 有些是粗体的,是项目特定的。 其他人是内build的 : 例如: /usr/include/C++/4.6/ /usr/include/x86_64-linux-gnu etc 如果我删除: work/.metadata/.plugins/org.eclipse.cdt.make.core/*.sc Eclipse启动时会自动重新扫描path。 我有gcc 4.6和gcc 4.7并排安装。 当Eclipse重新扫描它只能find4.6头,而不是4.7。 我的问题是:Eclipse通过什么机制来确定内置包含path列表? (因此为什么只find4.6头,而不是4.7头?)

如何减less生成的二进制文件的大小?

我知道有一个选项“-Os”“优化大小”,​​但它有一点影响,甚至在某些场合增加的大小:( strip(或“-s”选项)删除debugging符号表,工作正常; 但只能减less一个规模的小比例。 还有什么其他的方法可以去吗?

GCC选项的共享和-WI共享区别

我知道-Wl,-shared是ld的一个选项。 我见过有人这样编译, $ gcc -shared -Wl,-soname,libtest.so -o libtest.so *.o 还有一些人喜欢这个 $ gcc -Wl,-shared -Wl,-soname,libtest.so -o libtest.so *.o 所以我想知道-shared和-Wl,-shared是否有区别。 谢谢。

如何从编译的二进制文件(.so)中删除string

如何从/混淆编译的二进制文件中删除string? 目标是避免让人们阅读里面的函数/方法的名字。 它是一个dynamic库(.so),由Android的C ++代码和NDK工具(包括GCC)编译而成, 我使用-O3编译,并且已经使用了arm-eabi-strip -g mylib.so来删除debugging符号,但是当我执行strings mylib.so所有函数/方法的名称仍然是可读的。

gcc编译的二进制文件给“不能执行二进制文件”

我编译这个程序: #include <stdio.h> int main() { printf("Hello World!"); return 0; } 有了这个命令: gcc -c "hello.c" -o hello 当我试图执行你好,我得到 bash: ./hello: Permission denied 因为权限是 -rw-r–r– 1 nathan nathan 856 2010-09-17 23:49 hello 因为某些原因?? 但无论…更改权限,并尝试再次执行后,我得到 bash: ./hello: cannot execute binary file 我使用的是gcc(Ubuntu 4.4.3-4ubuntu5)4.4.3 我在这里做错了什么? 这是显而易见的…现在为时已晚,我一直用我疲惫的眼睛试图找出这个简单的问题…. PS我做(有时)在比Hello World更复杂的程序上工作,但gcc正在做这个全面的…

共享库path作为可执行目录

为了重用代码,我有一个应用程序被分成几个库。 在Windows上,我所要做的就是将.dll文件放在与可执行文件相同的path中,并自动find它们。 在Linux上(因为它硬编码的path),我必须指定环境variablesLD_LIBRARY_PATH或在可执行文件之前预先加载库。 我已经看到了一些使用-Wl,-rpath=<PATH>链接器选项embeddedpath的东西,我试过了. 作为path。 但是,这只是在当前的工作目录,而不是可执行文件的目录。 有没有一种方法可以在链接器中默认查找共享库的可执行文件的目录(如在Windows上)? 谢谢! 马特

编译器:了解从小程序生成的汇编代码

我正在研究编译器是如何工作的。 我正在通过阅读从小型64位Linux程序反汇编生成的代码来学习。 我写了这个C程序: #include <stdio.h> int main() { for(int i=0;i<10;i++){ int k=0; } } 使用objdump后,我得到: 00000000004004d6 <main>: 4004d6: 55 push rbp 4004d7: 48 89 e5 mov rbp,rsp 4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0 4004e1: eb 0b jmp 4004ee <main+0x18> 4004e3: c7 45 fc 00 00 00 00 mov DWORD […]