Articles of gcc

Linux共享库中全局variables的单个拷贝

这个问题与这个问题非常相似,但是没有提到的解决scheme是有帮助的。 假设我有一个使用本地全局variables的函数的共享库B. 这个函数是从第二个共享库C中调用的 B和C都被A使用,我期望每个都有它自己的全局variables实例,但不知何故,编译器设法将它们链接到指向相同的对象(与Windows不同)。 有人可以提出一种方法,让我有不同的全球变数的实例在A? 以下是我的代码。 运行a.out时,我希望得到 1 calling from someCFunc(): 1 但是,我得到: 1 calling from someCFunc(): 2 BH: #ifndef _B_H_ #define _B_H_ extern "C" __attribute__ ((visibility("default"))) void myFunc(); #endif b.cpp: #include "bh" #include <iostream> int myGlobal = 0; extern "C" __attribute__ ((visibility("default"))) void myFunc() { ++myGlobal; std::cout << myGlobal << "\r\n"; } CH: #ifndef […]

C / GCC:dlopen()而不需要dlsym()

我可以使用dlopen()和RTLD_NOW来延迟加载共享库。 但是,一旦库dynamic加载,仍然需要使用dlsym来单独加载每个符号。 由于我的库包含大量的API,所以我不想为它们调用dlsym。 有没有办法使API的工作方式与正常的加载时间链接相同(只需调用API而不需要dlsym)?

为什么当我使用__EXPORT_SYMBOL时只有一个部分?

我们知道,当我们想要导出我们的符号时使用__ EXPORT_SYMBOL。 我发现exort.h中有一个macros,如下所示: #ifdef CONFIG_MODVERSIONS /* Mark the CRC weak since genksyms apparently decides not to * generate a checksums for some symbols */ #define __CRC_SYMBOL(sym, sec) \ extern void *__crc_##sym __attribute__((weak)); \ static const unsigned long __kcrctab_##sym \ __used \ __attribute__((section("___kcrctab" sec "+" #sym), unused)) \ = (unsigned long) &__crc_##sym; #else #define __CRC_SYMBOL(sym, sec) […]

gdb tracepoint的操作不起作用

跟踪点可以跟踪,但跟踪操作不能正常工作。 在gdb的最后一侧显示跟踪点被跟踪。 但“收取$ regs”不能按预期工作。 我的平台是RH6.4。 1.gdbserver端。 gdbserver :10000 ./a.out Process ./a.out created; pid = 10466 Listening on port 10000 Remote debugging from host 127.0.0.1 2. gdb方。 gdb a.out (gdb) target remote :10000 Remote debugging using :10000 Reading symbols from /lib64/ld-linux-x86-64.so.2…(no debugging symbols found)…done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 0x00000033b7000b00 in _start () from /lib64/ld-linux-x86-64.so.2 Created trace […]

Polarssl AES计数器模式的例子

我正在寻找一个Polarssl AES计数器模式的例子。 找不到任何地方。 对于像我这样的初学者来说, 文档是很难理解的。 它被定义为polarssl int aes_crypt_ctr (aes_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output) 我是这样写的 aes_context aes; unsigned char key[32]; unsigned char iv[16]; unsigned char input [128]="Hello"; unsigned char output[128]; size_t input_len = 40; size_t output_len = 0; aes_setkey_enc(&aes, key, 128); aes_crypt_ctr […]

分段错误当我在Linux上运行使用Hard Float构build的Neon代码时

我有一个代码与霓虹灯assembly优化的一个function。 我用gcc构build它,并运行在Cortex A9(硬浮动图像)上。 当我build立一个非优化代码(纯C没有汇编)与硬浮选项,如:-mapc -march = armv7-a -mtune = cortex-a9 -mfloat-abi = hard -mfpu = neon,它工作正常。 当我介绍我的汇编代码,并用下列标志进行汇编:-march = armv7 -a -mfloat-abi = hard -mfpu = neon它构build得很好,但是出现了分段错误。 还有一点需要注意的是,如果我使用-mfloat-abi = softfp代替hard(和带有-static选项的链接)来构build程序集优化代码,则运行良好。 为什么汇编代码会造成Hard float问题? 我遇到了硬/软abi选项上的其他post,但是我没有find解决scheme,我的具体情况(C代码工作,但霓虹灯大会给分段错误) 编辑:董事会没有gdb,我通过gdb服务器远程尝试,但提出了其他连接问题。 所以我不能使用gdb进行debugging。 但是,我所做的debugging:只要我进入汇编函数,我推寄存器,然后分支到最后,再次popup寄存器。 它仍然给分段错误。 我可以推断,这不是一个特定的指示给予错误。 一些标志丢失在生成文件或其他forms和特定于硬浮点的程序集中的语法? 另外,当我使用armcc选项–fpu = vfpv3_d16构build库时,它仍然可以工作。 这是很难对付的吗? 所以我推断组合GCC +汇编代码+硬盘浮动是一个问题…请给你的build议,如果你曾经与这个/类似的组合。 编辑如果汇编代码中包含像MOV r0, r1或ADD r1, r2,r2这样的明确指令,则会运行该代码ADD r1, r2,r2但在出现与LDR r1, [r2]或mov r0, #0一样的任何常量或内存相关操作的情况下会出现分段错误。 […]

标识符未加载到c

我试图运行一个例子来处理信号,它无法编译一个未知的标识符。 这是如何加载头: #define __USE_GNU #include <ucontext.h> 而编译错误(与海湾合作委员会): $ gcc -o sa_siginfo sa_siginfo.c sa_siginfo.c: In function 'bt_sighandler': sa_siginfo.c:25:28: error: 'REG_RIP' undeclared (first use in this function) uc->uc_mcontext.gregs[REG_RIP]); GCC信息: $ gcc –version gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 /usr/include/ucontext.h确实包含/usr/include/sys/ucontext.h其中包含: #ifdef __x86_64__ […] #ifdef __USE_GNU /* Number of each register in the `gregset_t' array. */ enum { […] REG_RIP, (我的系统是64位) […]

不能用64位gcc在32位build立boost库

我试图在64位Linux机器上以32位格式构buildBoost C ++库。 运行bootstrap.sh后,我运行: ./b2 address-model=32 所有我得到的输出是g ++输出的负载说编译终止。 并没有编译库的结果,都跳过了。 对于我来说,这是非常令人沮丧的,因为我无法find任何其他有同样问题的人。 所有的答案似乎指向使用“address-model = 32”选项,这根本不工作。 如果我指定没有选项,只是运行: ./b2 那么一切都很好,build立成功。 但是,这个build立64位的图书馆呢? 当我的目标是32位系统时,这不是我想要的。 我使用的是Ubuntu 13.10 64位,并试图build立升压1.55.0。 任何帮助表示赞赏。 谢谢!

用arm-none-eabi-gcc编译hello world程序C时出错

我想在Linux 64位机器上用C语言编译一个hello world程序。 我正在使用ARM交叉编译器将我的应用程序加载到ARM处理器上。 但是,使用arm-none-eabi-gcc -o hello hello.c编译代码时,出现一系列错误: /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-在exit': exit.c:(.text.exit+0x2c): undefined reference to函数exit': exit.c:(.text.exit+0x2c): undefined reference to _exit'/ home / dico / gcc-arm-none -eabi-4_7-2013q3 / bin中/../ LIB / GCC /臂-NONE-EABI / 4.7.4 /../../../../臂-NONE-EABI / LIB /的libc.a( lib_a-sbrkr.o):函数_sbrk_r': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to _sbrk'/ home / dico / gcc-arm-none-eabi-4_7-2013q3 / bin /。 ./lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o):在函数_write_r': writer.c:(.text._write_r+0x20): undefined reference to […]

-fprofile-arcs链接器选项是什么意思?

我想在我的应用程序中有代码覆盖,所以在premake.lua我添加了以下内容: if options["coverage"] then tinsert(package.buildoptions, {"-fprofile-arcs", "-ftest-coverage"}) tinsert(package.links, "gcov") end 然后我运行以下命令: premake –coverage –target gnu ; make 这不工作,直到我join以下内容: if options["coverage"] then tinsert(package.buildoptions, {"-fprofile-arcs", "-ftest-coverage"}) tinsert(package.linkoptions, {"-fprofile-arcs"}) tinsert(package.links, "gcov") end 这是互联网上提出的一个解决scheme。 我的问题是,我发现这个-fprofile-arcs链接器标志0文档…它是做什么的? 它在哪里logging?