Tag: gcc

我在海湾合作委员会误解了__attribute __((打包))吗?

我正在尝试以下,在win32上使用gcc。 #include struct st { char c; int x; } __attribute__ ((packed)); int main() { printf(“%d\n”, sizeof(struct st)); return 0; } 我希望打印的值是5,但它是8。 然而,有了以下内容,我得到了5。 #include #pragma pack(1) struct st { char c; int x; }; int main() { printf(“%d\n”, sizeof(struct st)); return 0; } 我的程序肯定有问题,但我看不清楚。 我已经阅读了gcc的手册以及有关此问题的几个问题,我仍然感到困惑。 任何提示? 同样从SO的这些问题的答案,我明白我不应该使用打包的结构进行编组 ,我可能不会使用它太多,但我仍然想了解我在这样的情况下无法看到的内容。短节目。 注意:gcc-4.9.2和gcc-4.8.4都会出现问题。

gcc` -shared`选项如何影响输出?

从技术上讲,就文件内容而言, gcc -fPIC -shared src.c和gcc -fPIC src.c的输出有什么区别? 假设在src.c定义了int main(int, char**) ,以便两个编译都成功。 但是按预期执行gcc -shared src.c生成的a.out会出现以下错误: -bash: ./a_shared.out: cannot execute binary file 即使它有一个mainfunction。 另外,如何使用otool或objdump等工具检查输出文件的差异? 非常感谢。

print_once,它是如何阻塞的?

我试图理解实现一次打印function,这段代码工作正常; 但是我无法理解一些事情:1)这是如何阻塞的? 也许我无法正确清除它,但只是想知道, C的哪些属性会让这种情况发生? 1 #include 2 3 #define _TRACE_ 4 5 #ifdef _TRACE_ 6 #define print_once(fmt, …) \ 7 ({ \ 8 static bool __print_once=false; \ 9 if(!__print_once) { \ 10 __print_once = true; \ 11 do { \ 12 printf(fmt, ##__VA_ARGS__); \ 13 }while(0); \ 14 } \ 15 }) 16 #else 17 […]

无法从MSR回读

我正在编写一个内核模块,它是关于读写MSR的。 我写了一个简单的测试程序,但它仍然失败。 它所做的只是写入MSR,然后再读回来。 这是代码: static int __init test3_init(void) { uint32_t hi,lo; hi=0; lo=0xb; asm volatile(“mov %0,%%eax”::”r”(lo)); asm volatile(“mov %0,%%edx”::”r”(hi)); asm volatile(“mov $0x38d,%ecx”); asm volatile(“wrmsr”); printk(“exit_write: hi=%08x lo=%08x\n”,hi,lo); asm volatile(“mov $0x38d,%ecx”); asm volatile(“rdmsr”:”=a”(lo),”=d”(hi)); printk(“exit_write2: hi=%08x lo=%08x\n”,hi,lo); return 0; } 输出如下: exit_write: hi=00000000 lo=0000000b exit_write2: hi=00000000 lo=00000000 有人能告诉我为什么第二个输出中的返回值为0,而不是原始值? 我的代码有问题吗? 非常感谢。

arm-none-eabi-ld:找不到-lc

我正在尝试为基于XMC1100的开发板编写代码。 我正在尝试这个教程: http : //eleceng.dit.ie/frank/arm/BareMetalXMC2Go/index.html 我已经下载了blinky.tar.gz文件并解压缩。 当我尝试“make”时,我收到了这个错误:arm-none-eabi-ld:找不到-lc 这是“make”的输出 arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -g init.c -o init.o arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -g main.c -o main.o arm-none-eabi-ld init.o main.o -L /usr/lib/gcc/arm-none-eabi/4.8.2/armv6-m -T linker_script.ld -lc –cref -Map main.map -nostartfiles -o main.elf arm-none-eabi-ld: cannot find -lc make: *** [main.elf] Error 1 我正在使用Linux Mint 17 Qiana 我错过了什么? 这是我的makefile: LIBSPEC=-L /usr/lib/gcc/arm-none-eabi/4.8.2/armv6-m […]

adcx和adox的测试用例

我正在测试带有进位的英特尔ADX添加和添加溢出到管道添加大整数。 我想看看预期的代码生成应该是什么样子。 从_addcarry_u64和_addcarryx_u64与MSVC和ICC ,我认为这将是一个合适的测试用例: #include #include #include “immintrin.h” int main(int argc, char* argv[]) { #define MAX_ARRAY 100 uint8_t c1 = 0, c2 = 0; uint64_t a[MAX_ARRAY]={0}, b[MAX_ARRAY]={0}, res[MAX_ARRAY]; for(unsigned int i=0; i< MAX_ARRAY; i++){ c1 = _addcarryx_u64(c1, res[i], a[i], (unsigned long long int*)&res[i]); c2 = _addcarryx_u64(c2, res[i], b[i], (unsigned long long int*)&res[i]); } return 0; […]

Cygwin输出.exe中的gcc编译器

刚从C开始,学习基础知识。 我已经创建了一个简单的程序,在编译时,可以编译为a.out但是gcc正在编译为a.exe。

C99和C ++内联函数的兼容定义

我有一个由C ++ 11应用程序代码使用的C99代码实用程序库。 一些内联函数以C99样式声明,并在转换单元中显式生成代码,如: // buffer.h inline bool has_remaining(void* obj) { … } // buffer.c extern inline bool has_remaining(void * obj); 但是,当我尝试在C ++应用程序中使用has_remaining时,我在链接时遇到有关多个定义的错误。 似乎g ++正在实例化已经存在于库中的内联代码,尽管有extern “C” 标头保护说明符。 有没有办法强制g ++使用这种类型的定义? 看起来如果#ifdef __cplusplus是一个带有gnu_inline属性的extern定义,那么正确的事情就会发生,但是肯定有一种更便携的方式来保持现代C头与现代C ++兼容吗? – 编辑:工作示例 – buffer.h: #ifndef BUFF_H #define BUFF_H #include #include #ifdef __cplusplus extern “C” { #endif inline bool has_remaining(void const* const obj) { […]

typedef with restrict关键字

我定义了像这样的对齐浮点数 typedef __attribute((aligned(64))) float aligned_float; 然后我用这样的restrict关键字定义对齐的浮点数 typedef aligned_float * restrict aligned_floatptr; 这与我期望的一样。 但由于我几乎总是想要这两个在一起,所以我尝试将typedef放在一行中 typedef __attribute((aligned(64))) float * restrict aligned_floatptr2 但是,这不起作用。 仍然可以识别restrict关键字,但不会对齐。 然而,编译器没有给我任何警告。 我只是通过查看组件才意识到对齐不起作用。 为什么组合定义不起作用,为什么我不收到警告? 你可以在这里看到Clang和GCC的组件。 我想这样做的原因是我有这样的代码 static void kernel(float * restrict a, float * restrict b, float * restrict c, int n) { a = __builtin_assume_aligned(a, 64); b = __builtin_assume_aligned(b, 64); c = __builtin_assume_aligned(c, 64); […]

这个汇编声明是什么意思?

我正在使用-s标志查看gcc生成的汇编代码。 一些陈述如下所示。 movl is_leader(%rip), destination 这里, is_leader是C代码中int类型的全局定义变量。 我不明白的是这里的术语是is_leader(%rip) 。 是不是翻录指令指针? 我需要知道这个语句是如何用来访问is_leader的 。