Tag: gcc

在编译时未定义引用`__sync_val_compare_and_swap_4’错误,使用gcc 4.1.1和4.2.0对Sparc v8目标

使用crosstool脚本我在Cygwin下构建了Sparc架构的以下编译器gcc-4.1.1和4.2.0 20061024(预发行版): $ ./sparc-unknown-linux-gnu-gcc -v Using built-in specs. Target: sparc-unknown-linux-gnu Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure –target=sparc-unknown-linux-gnu –host=i686-host_pc-cygwin –prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu –with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include –with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu –disable-nls –enable-threads=posix –enable-symvers=gnu –enable-__cxa_atexit –enable-languages=c,c++ –enable-shared –enable-c99 –enable-long-long Thread model: posix gcc version 4.1.1 和 $ ./sparc-unknown-linux-gnu-gcc -v Using built-in specs. Target: sparc-unknown-linux-gnu Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024- glibc-2.3.6/gcc-4.2-20061024/configure –target=sparc-unknown-linux-gnu –host=i 686-host_pc-cygwin –prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un known-linux-gnu –with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc -unknown-linux-gnu/sparc-unknown-linux-gnu/include –with-local-prefix=/opt/cros stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g nu […]

`-rdynamic’究竟做了什么以及何时需要它?

-rdynamic (或–export-dynamic器级别的–export-dynamic )究竟做了什么以及它如何与-fvisibility* flags或visibility pragma s和__attribute__ s定义的符号可见性相关? 对于–export-dynamic , ld(1)提到: …如果使用“dlopen”加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项。 … 我不确定我完全明白这一点。 你能否提供一个例子,如果没有-rdynamic ,它会不起作用,但是呢? 编辑 :我实际上尝试编译了几个虚拟库(单个文件,多个文件,各种-O级别,一些函数间调用,一些隐藏符号,一些可见),有和没有-rdynamic ,到目前为止我已经得到字节相同的输出(当然保持所有其他标志不变),这是非常令人费解的。

将#define X宏值替换为编译命令中指定的另一个值

假设我有这个代码: #include #ifndef STR #define STR “HELLO” #endif int main() { printf(STR “WORLD \n”); return 0; } 这基本上转换为:如果未定义STR,则将其定义为“HELLO”,因此程序输出将是 你好,世界 现在,我的问题是:在使用gcc编译时如何修改此STR值? 例如,我想将“HELLO”更改为“HI”而不更改源(program.c)文件中的任何内容。 这样做的gcc语法是什么? 我试过了 gcc -Wall program.c -DSTR =“HI”-o program 但它没有产生预期的产量。 有什么建议? 谢谢!

GCC内存泄漏检测相当于Microsoft crtdbg.h?

在Visual Studio中使用Microsoft MSVC编译器开发通用C ++库多年后,我们现在将其移植到Linux / Mac OS X(为我们祈祷)。 我已经习惯了并且非常喜欢MSVC中简单的内存泄漏检测机制: #ifdef DEBUG #define _CRTDBG_MAP_ALLOC #define NEW new( _NORMAL_BLOCK, __FILE__, __LINE__) #include #include #else #define NEW new #endif 每个内存分配都使用此NEW宏完成。 每当使用我们的库的进程终止时,控制台上会报告任何内存泄漏(尚未解除分配的块)以及最初分配内存的文件和行#。 关于这个我喜欢的部分是我不必主动“运行性能工具”或以其他方式表明我正在寻找泄漏。 每次进程终止时,都会在正常的开发过程中向我报告泄漏。 现在我们正在转向GCC世界,我发现内存泄漏检测工具,其中许多非常复杂,需要我明确表明我处于泄漏搜索模式。 我的IDE是Xcode,我已经研究了一些分配/泄漏检测工具(比如Instruments和MallocDebug),但我承认我还没有花时间完全了解它们。 事实上,我实际上必须提前说明我正在寻找泄漏,而不是自动提醒它。 我正在使用Xcode 3.2,我听说现在有一个静态分析工具的漂亮集成,但我再次没有考虑过这个。 我正在寻找一些关于我的选择的想法。 GCC和/或Xcode中是否有类似的机制? 是否有一个简单的第三方库或工具可以执行我所熟悉和喜爱的基本function? 或者我应该吮吸它并学习新的做事方式?

gcc的正确选项顺序是什么?该序列的重要性是什么?

我用这个命令来编译我的程序: gcc -g -Wall -Werror -lpthread multi_thread_server.c -o multi_thread_socket_v4 它给undefined reference to 错误提供了undefined reference to 。 经过大量的试验和错误修复错误后,我(错误地)将选项重新排列为gcc : gcc multi_thread_server.c -lpthread -Wall -Werror -o multi_thread_server -g 它工作。 我在SO读到这个问题 ,我明白了为什么会这样。 在这里我想知道,对于gcc使用的选项序列是否有任何规则? PS:我知道gcc有无限的选项,我想根据选项的类别知道序列。

C unsigned long long和imulq

作为一个刚接触组装的人,我使用gcc进行逆向工程。 但是现在我遇到了一个有趣的问题:我尝试将两个64位整数乘以x86-64。 C代码如下: unsigned long long val(unsigned long long a, unsigned long long b){ return a*b; } 并使用gcc编译: val: movq %rdi, %rax imulq %rsi, %rax ret 将有符号乘法用于无符号整数可能违反直觉,但它适用于C. 但是,我想检查溢出的乘法。 现在,如果结果大于2^63-1则设置溢出标志(我猜是因为它毕竟是带符号的乘法)。 但是对于无符号64位,只要结果不大于2^64-1这仍然可以。 在这种情况下,进行乘法(在assembly中)的正确方法是什么?

为什么execstack需要在堆上执行代码?

我编写了下面的代码来测试安全类中的赋值的shellcode(用于取消链接/tmp/passwd )。 当我使用gcc -o test -g test.c编译时,我在跳转到shellcode时得到了一个段错误。 当我使用execstack -s test对二进制文件进行后处理时,我不再获得段错误并且shellcode正确执行,删除了/tmp/passwd 。 我正在运行gcc 4.7.2 。 为了使堆可执行,似乎要求堆栈是可执行的似乎是个坏主意,因为后者比前者有更多合法的用例。 这是预期的行为吗? 如果是这样,理由是什么? #include #include char* shellcode; int main(){ shellcode = malloc(67); FILE* code = fopen(“shellcode.bin”, “rb”); fread(shellcode, 1, 67, code); int (*fp)(void) = (int (*) (void)) shellcode; fp(); } 这是xxd shellcode.bin的输出: 0000000: eb28 5e89 760c 31c0 8846 0bfe c0fe c0fe […]

如何在OSX上安装gtk以与g ++ / gcc编译器一起使用

我已经在apple.stackexchange.com上问了这个问题,但是我被告知这个问题是错误的 – 所以我会在这里问一下,正如我的建议那样。 在我的大学,我们完成了实施具有GTK-GUI的c程序的任务。 GTK-GUI已经实现,我们只需要实现一个算法来提供一些数据。 我已经有gcc / g ++了。 但是当我尝试编译项目时,编译器返回错误,它没有找到gtk: fatal error: ‘gtk/gtk.h’ file not found #include ^ 所以我的问题是:如何在OSX Mavericks上安装gtk以便将它与gcc / g ++编译器一起使用? 我的设置:MacBook Pro Retina Mid 2012与OSX Mavericks。 Homebrew已安装并正常工作,如果它对安装有用。 (当然安装了Apple Command Line开发者工具)

为什么在C中使用错误的格式说明符会使我的程序在Windows 7上崩溃?

我的节目如下; #include #include int main() { char string[] = “Gentlemen start your engines!”; printf(“That string is %s characters long.\r\n”, strlen(string)); return 0; } 我正在gcc下编译,虽然它没有给我任何错误,程序每次运行时都会崩溃。 从我见过的例子来看,代码似乎很好。 很高兴知道我做错了什么。 谢谢。

MSVC中的复合文字

在海湾合作委员会,我能够这样做: (CachedPath){ino} inode->data = (struct Data)DATA_INIT; 哪里: struct CachedPath { Ino ino; }; typedef int8_t Depth; struct Data { Offset size; Blkno root; Depth depth; }; #define DATA_INIT {0, -1, 0} MSVC为这些类型的强制转换提供以下错误: error C2143: syntax error : missing ‘;’ before ‘{‘ 我怎样才能在MSVC中这样做? 进一步注意,代码已经从C99转换而来,我为此使用了指定的初始值设定项,然后进行类似的转换。 关于C99与C ++的MSVC / GCC实现之间如何关联这些各种特征的任何清晰都是值得赞赏的。