Tag: gcc

获取可执行文件中文本部分的开始和结束地址

我需要获取可执行文件部分的开始和结束地址。 我怎么才能得到它? 我可以从_init符号或_start符号获取起始地址,但是结束地址呢? 在开始.rodata部分之前,我应该考虑text部分的结束地址是最后一个地址吗? 或者我应该编辑默认的ld脚本并添加我自己的符号来指示文本部分的开头和结尾,并在编译时将其传递给GCC? 在这种情况下,我应该在哪里放置新符号,我应该考虑init和fini部分吗? 获取文本部分的开始和结束地址的好方法是什么?

&operator在函数指针赋值中可选

在以下代码中: /* mylog.c */ #include #include /* for atoi(3) */ int mylog10(int n) { int log = 0; while (n > 0) { log++; n /= 10; } return log; } int mylog2(int n) { int log = 0; while (n > 0) { log++; n >>= 1; } return log; } int main(int argc, […]

GNU C中的__attribute __((const))vs __attribute __((pure))

GNU C中__attribute__((const))和__attribute__((pure))什么区别? __attribute__((const)) int f() { /* … */ return 4; } VS __attribute__((pure)) int f() { /* … */ return 4; }

初始化指针时的字符串文字与char数组

灵感来自这个问题 。 我们可以用字符串文字初始化一个char指针: char *p = “ab”; 它完全没问题。 人们可以认为它等同于以下内容: char *p = {‘a’, ‘b’, ‘\0′}; 但显然事实并非如此。 并且不仅因为字符串文字存储在只读内存中,而且看起来即使通过字符串文字具有char数组类型,并且初始化程序{…}具有char数组的类型,两个声明也是由于编译器发出警告,处理方式不同: 警告:标量初始化程序中的多余元素 在第二种情况下。 这种行为的解释是什么? 更新: 此外,在后一种情况下,指针p将具有值0x61 (第一个数组元素’a’ )而不是存储器位置,这样编译器就像警告一样,仅占用初始化器的第一个元素,将其分配给p 。

嵌套函数在gcc中是坏事吗?

我知道嵌套函数不是标准C的一部分,但由于它们存在于gcc中(并且事实上gcc是我唯一关心的编译器),我倾向于经常使用它们。 这是坏事吗 ? 如果是这样,你能告诉我一些令人讨厌的例子吗? gcc中嵌套函数的状态是什么? 他们会被删除吗?

‘asm’,’__ asm’和’__asm__’有什么区别?

据我所知, __asm { … };之间的唯一区别__asm { … }; 和__asm__(“…”); 是第一个使用mov eax, var ,第二个使用movl %0, %%eax使用:”=r” (var) 。 还有什么其他差异? 那么asm呢?

为什么将char **作为const char **传递会产生警告?

我一直在收到这个警告: note: expected ‘const char **’ but argument is of type ‘char **’ 现在,我通过将它们转换为const char **来传递参数。 还有其他方法我可以摆脱它吗?

使用整数的scanf进行分段错误

当我尝试使用以下function从用户读取整数输入时,我的C代码中出现了分段错误: int userChoice = 0, tS; float tR, tW, tP, aP; char title[35], title2[35]; Book *curr; while (userChoice != 9) { printf(“1. Determine and print total revenue\n”); printf(“2. Determine and print total wholesale cost\n”); printf(“3. Determine and print total profit\n”); printf(“4. Determine and print total number of sales\n”); printf(“5. Determine and print average profit per […]

为什么对mmap的内存进行未对齐访问有时会在AMD64上出现段错误?

我有这段代码在AMD64兼容CPU上运行Ubuntu 14.04时会出现段错误: #include #include #include int main() { uint32_t sum = 0; uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); uint16_t *p = (buffer + 1); int i; for (i=0;i<14;++i) { //printf("%d\n", i); sum += p[i]; } return sum; } 如果使用mmap分配内存,则仅此段错误。 如果我使用malloc ,堆栈上的缓冲区或全局变量,它不会发生段错误。 如果我将循环的迭代次数减少到少于14的次数,则不再是段错误。 如果我从循环内打印数组索引,它也不再是段错误。 为什么未对齐的内存访问能够访问未对齐地址的CPU上的段错误,为什么只有在这种特定情况下呢?

C未定义的行为。 严格别名规则或错误对齐?

我无法解释这个程序的执行行为: #include #include #include typedef char u8; typedef unsigned short u16; size_t f(u8 *keyc, size_t len) { u16 *key2 = (u16 *) (keyc + 1); size_t hash = len; len = len / 2; for (size_t i = 0; i < len; ++i) hash += key2[i]; return hash; } int main() { srand(time(NULL)); size_t len; […]