Articles of gcc

GDB警告:在0x7ffff7ffd000处添加的符号文件系统提供的DSO中找不到可加载部分

abijith bufferOverFlow $ gdb a.out GNU gdb (GDB) 7.6 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. […]

共享对象文件中的版本号

我正在使用GCC从一组C ++源文件构build共享对象文件。 所有关于构build.so文件的示例教程都显示了使用.so后缀之后的版本号创build的文件。 例如: gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o 这会产生.so文件libmean.so.1.0.1 另外,如果我浏览本地机器上的/usr/lib目录,则会发现很多.so文件的末尾都有版本号。 但是,当我编译一个共享对象文件并将其放在/usr/lib ,如果我在末尾添加版本号,连接器将无法find它。 如果我删除版本号,它工作正常。 我真的不在乎放置一个版本号,我只是不明白为什么这似乎是一个共同的惯例,但这会导致共享库不工作的链接器。 那么,这是怎么回事? 为什么有一个约定将版本号放在.so文件名的末尾?

为什么编译器版本出现在我的ELF可执行文件中?

我最近使用gcc在Debian Linux下编译了一个简单的hello world C程序: gcc -mtune=native -march=native -m32 -s -Wunused -O2 -o hello hello.c 文件大小是2980字节。 我在一个hex编辑器中打开它,我看到以下几行: GCC: (Debian 4.4.5-8) 4.4.5 GCC: (Debian 4.4.5-10) 4.4.5 .shstrtab .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .text .fini .rodata .eh_frame .ctors .dtors .jcr .dynamic .got .got.plt data.data .bss .comment 他们真的需要吗? 没办法减less可执行文件的大小?

为什么在缓冲区的末尾和保存的帧指针之间有8个字节?

我正在为作业做一个堆叠砸练习,而且我已经完成了作业,但是有一个方面我不明白。 这是目标程序: #include <stdio.h> #include <stdlib.h> #include <string.h> int bar(char *arg, char *out) { strcpy(out, arg); return 0; } void foo(char *argv[]) { char buf[256]; bar(argv[1], buf); } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "target1: argc != 2\n"); exit(EXIT_FAILURE); } foo(argv); return 0; } 以下是在运行Ubuntu 12.04的x86虚拟机上禁用ASLR编译命令。 gcc -ggdb -m32 […]

为什么gcc 4.x默认在调用方法时为linux上的堆栈保留8个字节?

作为asm的初学者,我正在检查gcc -S生成的asm代码来学习。 为什么gcc 4.x默认为调用方法时保留8个字节的堆栈? func18是空函数,没有返回没有参数没有本地variables定义。 我不知道为什么8字节保留在这里(没有任何论坛/网站提到的理由,脂肪酶似乎是理所当然的)是%ebp只是推? 还是返回types? 很多thx! .globl _func18 _func18: pushl %ebp movl %esp, %ebp subl $8, %esp .text

argv:消毒通配符

我正在做一个K&R C书中的例子,它要求你基本上build立一个RPN计算器,它通过命令行参数来input。 我的解决scheme基本上遍历给定的参数,并吐出答案,但我注意到了一些事情: 如果我给乘法字符(星号) '*'没有单引号,gcc认为是一个通配符input,所以我的input $./rpn 5 10 * 给我一个输出 read 5 read 10 read rpn read rpn.c = 0 用单引号包裹星号可以解决问题 $./rpn 5 10 '*' read 5 read 10 read * = 50 我的问题是有没有办法消毒input,以便我的程序不需要用单引号包裹星号,或者是由更基本的东西(例如Linux / POSIX / UNIX二进制执行和参数处理)引起的这种行为?

无法使用静态TLS加载更多对象

我有一个应用程序使用dlopen()来加载额外的模块。 应用程序和模块是在Ubuntu 12.04 x86_64上使用gcc 4.6而构build的,但是为了i386 arch。 然后将二进制文件复制到具有完全相同的操作系统的另一台机器,并正常工作 但是,如果它们被复制到Ubuntu 12.04 i386,则一些(但不是全部)模块将无法加载以下消息: dlopen: cannot load any more object with static TLS 我怀疑这是由__threadvariables的使用引起的。 但是,这些variables不会在加载的模块中使用 – 只能在加载器模块本身中使用。 有人可以提供任何额外的信息,可以是什么原因? 我正在减less__threadvariables的数量并优化它们(使用-ftls-model等),我只是好奇它为什么不能在几乎相同的系统上工作。

GCC存储的string常量以及这些指针映射的位置在哪里?

当我编译并运行我的Linux x86_64机器上的C程序时,由GCC编译: #include <stdio.h> int main(void) { char *p1 = "hello"; // Pointers to strings char *p2 = "hello"; // Pointers to strings if (p1 == p2) { // They are equal printf("equal %p %p\n", p1, p2); // equal 0x40064c 0x40064c // This is always the output on my machine } else { printf("NotEqual %p […]

使用arm-none-eabi-gcc编译和链接库liba.a错误

我在64位Linux机器上用C语言编译hello world程序。 我正在使用一个GCC ARMembedded式工具链,用一个ATMEL AT91SAM9G20处理器在FOX G20 V板上交叉编译我的程序。 在第一次,我编译时有一些错误,因为程序没有识别printf,return等函数(标准的C函数)。 所以我决定在函数之间build立链接,我相信这些函数是在libc.a库中定义的(纠正我,如果我错了),通过执​​行arm-none-eabi-gcc -o hello hello.c libc.a但结果仍然导致错误: libc.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x16): undefined reference to `_exit' libc.a(lib_a-sbrkr.o): In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' libc.a(lib_a-writer.o): In function `_write_r': writer.c:(.text._write_r+0x10): undefined reference to `_write' libc.a(lib_a-closer.o): In function `_close_r': closer.c:(.text._close_r+0xc): undefined reference to `_close' libc.a(lib_a-fstatr.o): In function `_fstat_r': fstatr.c:(.text._fstat_r+0xe): undefined […]

如何从stdin编译代码?

代码很简单: test$ cat test.cpp int main() { } 有没有办法编译来自标准输出的代码? 我试过这个: cat test.cpp | g++ – 和一些变化,但没有产生可执行文件。 只是一些澄清。 我有一个程序预处理一个文件,并产生我想要编译的另一个文件。 我想过不要创build这个中间文件,而是直接生成目标文件。