Articles of gcc

我的蹦床不会反弹(绕路,C ++,GCC)

这感觉就像我滥用我所有的问题Stackoverflow,但它是一个问答论坛毕竟:)无论如何,我已经使用了一段时间了,但我还没有实现我自己(我已经使用包装更早)。 因为我想完全控制我的代码(谁不?),我决定自己实现一个function齐全的绕行程序,所以我可以理解我的代码的每个字节。 代码(下面)尽可能简单,但问题不是。 我已经成功地实施了绕道(即我自己的function),但是我还没有能够实施蹦床 。 每当我打电话给蹦床,根据我使用的偏移量,我得到“分段错误”或“非法指令”。 尽pipe两个案件都结束了。 “核心倾销”。 我认为这是因为我混淆了“相对地址”(注:我对Linux很新,所以我远远没有掌握GDB)。 如代码中所述,取决于sizeof(jmpOp) (在第66行),我得到一个非法指令或分段错误。 我很抱歉,如果这是明显的事情,我熬夜太晚了… // Header files #include <stdio.h> #include <sys/mman.h> #include <unistd.h> #include "global.h" // Contains typedefines for byte, ulong, ushort etc… #include <cstring> bool ProtectMemory(void * addr, int flags) { // Constant holding the page size value const size_t pageSize = sysconf(_SC_PAGE_SIZE); // Calculate relative […]

ELF程序头虚拟地址和文件偏移量

我知道两者之间的关系: 虚拟地址mod页面alignment==文件偏移mod页面alignment 但有人能告诉我这两个数字在哪个方向计算吗? 根据上述关系计算文件偏移量的虚拟地址,反之亦然? 更新 这里有一些细节:当链接器写ELF文件头时,它设置程序头的虚拟地址和文件偏移量(段) 例如有readelf -l someELFfile的输出readelf -l someELFfile : Elf file type is EXEC (Executable file) Entry point 0x8048094 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 RE 0x1000 LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW […]

(Docker)中缺lessGOMP_parallel或GOMP_4.0 jupyter / all-spark-notebook:R和Python

我有一个关于GOMP的问题,我认为与gcc有关。 我使用这个图像作为一些实验的基础。 看来我正在使用基于这个未经修改的图像的一个好的版本(4.9.2),但是我得到了一些Cython相关软件包的一些奇怪的行为。 例1 在未修改的jupyter / all-spark-notebook docker镜像上运行时,试图运行Python时出现以下问题, import lightfm Traceback (most recent call last): File "", line 1, in File "/opt/conda/lib/python3.4/site-packages/lightfm/init.py", line 1, in from .lightfm import LightFM File "/opt/conda/lib/python3.4/site-packages/lightfm/lightfm.py", line 7, in from .lightfm_fast import (CSRMatrix, FastLightFM, ImportError: /opt/conda/lib/python3.4/site-packages/lightfm/lightfm_fast.cpython-34m.so: undefined symbol: GOMP_parallel 我已经尝试过的事情: 转到文件lightfm.py并将所有依赖关系移动到一行上,如下所示: from .lightfm_fast import (CSRMatrix, FastLightFM, fit_logistic, predict_lightfm, fit_warp, fit_bpr, […]

C / C ++未使用的内联函数未定义的引用

考虑下面的代码(这不是pthread特定的;其他的例子,例如涉及实时库的那些,performance出类似的行为): #define _GNU_SOURCE #include <pthread.h> inline void foo() { static cpu_set_t cpuset; pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); } int main(int argc, char *argv[]) { } 这是C和C ++中的有效程序。 所以我把这个内容保存到testc.c和testcpp.cpp并尝试构build。 当我用C++我没有遇到任何错误。 当我build立在C我得到一个未定义的引用错误。 现在,这个错误发生在-O1和-O3 。 是否有指示gcc做正确的事情(请参阅foo未使用,并跳过对pthread_setaffinity_np定义的要求)? 编辑:我认为这是显而易见的上下文,但错误信息是: /tmp/ccgARGVJ.o: In function `foo': testc.c:(.text+0x17): undefined reference to `pthread_setaffinity_np' 请注意,因为foo没有在主path中被引用,所以g++完全忽略了这个函数,但gcc却没有。 编辑2:让我再试一次。 函数foo ,以及对pthread_setaffinity_np的后续调用未使用。 主要function是空的。 只要看看它! 不知何故, g++发现foo不需要被包含,随后当我们故意省略-lpthread (并且用nm检查导出的符号确认foo和pthread_setaffinity_np都不需要引用)时,构build过程并没有发生。 gcc所得到的输出结果并不符合这个事实。 我在问这个问题,因为C ++和C前端在相同的input上似乎给出了不同的结果。 这似乎并不是一个初步问题,因为我希望这两个path都给出相同的链接错误,这就是为什么我强调这似乎是一个编译器问题。 如果C […]

在linuxterminalgcc中编程编译c代码

我在Linux上写文本到文件中的ac程序。 我遇到了麻烦,我试图使用system("gcc fileName.c")编译我创build到可执行文件的新文档。 该文件正在获得以下input: char Msg[100] = {"#include <stdio.h>\nint main();\n\nint main()\n{\n\n\treturn 0;\n}"}; 显然它有一个main()函数,但它仍然给我以下的错误墙: /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid […]

如何设置二进制文件的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的地址之间有巨大的差距?