Articles of gcc

如何设置二进制文件的RunPath?

有无数的线程描述什么是RPATH , RUNPATH和LD_LIBRARY_PATH以及它们如何交互以解决库的位置。 要设置RPATH使用gcc选项: -Wl,-rpath,/path/to/dir 要设置LD_LIBRARY_PATH,请使用: export LD_LIBRARY_PATH= <path of lib> 我找不到如何设置RUNPATH ?

通过pip安装错误在virtualenv中安装lxml:命令'x86_64-linux-gnu-gcc'failed

当我激活virtualenv并input'pip install lxml'安装过程崩溃消息: /usr/bin/ld: cannot find -lz collect2: error: ld returned 1 exit status error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

将一个共享库静态链接到我的共享库

我正在努力一些有关链接我正在进行的项目的一些选项: 我正在尝试创build一个与其他两个库链接的共享库。 (让我们称他们为libfoo.so和libbar.so ) 我的输出库必须是一个共享库,我想静态链接libfoo.so到结果库,但libbar.so应链接为一个dynamic库。 ( libbar.so应该在每台机器上都可用, libfoo.so不可用,我不希望用户安装它/将其与我的二进制文件一起发送。) 我怎么能把这个存档? 我目前的构build指令是这样的: c++ -Wall -shared -c -o src/lib.o src/lib.cpp c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar 我的防守:我不是AC / C ++专家,所以如果这个问题看起来很愚蠢,那么对不起。

mmap是一个内置函数吗?

我知道mmap是一个系统调用,但glibc中必须有一些包装器来执行系统调用。 然而当我尝试使用gdb来遍历我的程序中的mmap函数时, gdb忽略它,因为它找不到任何源文件(注意我从源代码编译自己的glibc)。 我可以通过其他glibc库函数,如printf和malloc而不是mmap 。 我也使用了flag -fno-builtin,以便gcc不使用内置函数。 任何帮助,将不胜感激。

ASLR和地址

看看这个主要的: int main() { int asd = 10; printf("%p\n", &asd); return 0; } asd在给定时刻的地址: 0x7ffff5f7c16c 主要地址(总是一样的): (gdb) disass main Dump of assembler code for function main: 0x00000000004005b4 <+0>: push %rbp 为什么一个正则c程序的variables的地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置独立的)? 我发现地址变化是由ASLR模式引起的,但是为什么它只影响程序variables,并不影响代码的分配位置? 这是否与作为代码部分ro的事实有关,如果不是绝对必要的,它是没有意义的随机化的? 此外,为什么主要的地址与variablesasd的地址之间有巨大的差距?

有没有办法在运行时修改Linux C程序中的函数的代码?

简单来说,我们有两个相似的function: void f1() { printf("%d", 123); } void f2() { printf("%d", 124); } 现在我们在main调用f1,它打印123.编译时, f1的反汇编可能是这样的: 08048424 <f1>: 8048424: 55 push %ebp 8048425: 89 e5 mov %esp,%ebp 8048427: 83 ec 18 sub $0x18,%esp 804842a: b8 40 86 04 08 mov $0x8048640,%eax 804842f: c7 44 24 04 7b 00 00 movl $0x7b,0x4(%esp) 8048436: 00 8048437: 89 04 […]

不能理解在linux中关于函数调用的简单c代码的输出

当我试图理解函数调用时,我写了一个简单的代码。 但是我不明白它的输出。 #include <stdio.h> int* foo(int n) { int *p = &n; return p; } int f(int m) { int n = 1; return 999; } int main(int argc, char *argv[]) { int num = 1; int *p = foo(num); int q = f(999); printf("[%d]\n[%d]\n", *p, q); /* printf("[%d]\n", *q); */ } 输出: [999] [999] […]

了解C程序中的汇编语言_start标签

我写了一个简单的C程序,并试图使用GDB来debugging程序。 我明白在主要function中使用以下内容: 在进入 push %ebp mov %esp,%ebp 退出时 leave ret 然后我尝试gdb的_start,我得到了以下 xor %ebp,%ebp pop %esi mov %esp,%ecx and $0xfffffff0,%esp push %eax push %esp push %edx push $0x80484d0 push $0x8048470 push %ecx push %esi push $0x8048414 call 0x8048328 <__libc_start_main@plt> hlt nop nop nop nop 我无法理解这些线,以及这背后的逻辑。 有人可以提供任何指导,以帮助解释_start的代码?

为什么更新大数组使得“change_protection”内核调用占主导地位的CPU?

这里是代码gcc test.c -std=c99 #include <stdio.h> #include <stdlib.h> void main() { size_t size = (long) 40 * 1024 * 1024 * 1024; int* buffer = malloc(size * sizeof(int)); for (size_t i = 0; i < size; i++) { buffer[i] = 1; } printf("hello\n"); for (size_t i = 0; i < size; i++) { buffer[i] = 2; […]

移动到不同的Linux构build系统,出现错误:undefined symbol:stat

这可能只是我正在迁移到的构build系统的一个问题,但是我将在两个系统中包含差异以及我如何遇到问题。 我的旧版本系统是SLES 10机器。 gcc / cpp / g ++版本是4.1.0 我的新系统在SLES 11 SP4上,而gcc / cpp / g ++版本是4.3.4。 我正在build立一个共享库; 在新系统上build立和连接工作很好。 但是,在新系统加载时,我得到以下结果: error ./mysharedlib.so: undefined symbol: stat 由于status()函数包含在/usr/include/sys/stat.h中,所以我在两个系统上查看了glibc。 旧: # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.4-31.2 和新的: # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.11.3-17.95.2 我还查看了旧系统上与stat()相关的objdump输出: # objdump -T mysharedlib.so | grep stat 0000000000000000 D *UND* 0000000000000000 __xstat # objdump […]