c - 当程序使用自定义入口点(使用 gcc 7.4.0)运行时,scanf 会产生段错误

标签 c gcc

考虑以下代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("main\n");
    int a;
    scanf("%d", &a);
    printf("a = %d\n", a);
    return 0;
}

int main1() {
    printf("main1\n");
    int a;
    scanf("%d", &a);
    printf("a = %d\n", a);
    exit(0);
    return 0;
}

int main2() {
    printf("main2\n");
    int a = getchar() - '0';
    int b = getchar() - '0';
    int c = getchar() - '0';
    printf("a = %d\n", 100 * a + 10 * b + c);
    exit(0);
    return 0;
}

假设代码位于一个名为 test.c 的文件中,下面的代码工作正常(它打印“a = 123”):

gcc -o test test.c
echo 123 | ./test

但是,如果我使用自定义入口点运行程序,我会遇到可怕的段错误:

gcc -o test test.c -e"main1"
echo 123 | ./test

但是,如果我用三个 getchars 替换 scanf,程序将再次正常运行,尽管它是使用自定义入口点运行的:

gcc -o test test.c -e"main2"
echo 123 | ./test

更有趣的是,这些问题出现在 gcc 7.4.0 而不是 gcc 4.8.4。

有什么想法吗?

最佳答案

-e 命令行标志重新定义程序的实际 入口点,而不是“用户”入口点。默认情况下,将 GCC 与 GNU C 标准库 (glibc) 结合使用时,此入口点称为 _start,它会在调用用户提供的 main 函数之前执行进一步的设置。

如果你想替换这个入口点并继续使用 glibc,你需要自己进行进一步的设置。但也可以使用以下方法替换 main 入口点,这要简单得多:

gcc -c test.c
objcopy --redefine-sym main1=main test.o
gcc -o test test.o

请注意,这仅在您在代码中定义main 时才有效,否则您会从链接器。

关于c - 当程序使用自定义入口点(使用 gcc 7.4.0)运行时,scanf 会产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441103/

相关文章:

java - 这是如何运作的? x<<=3 = -8 其中(字节)x = 127?

c - 编译 Lua 时未解析的外部符号 _LoadLibraryExA

用优化编译得到一个错误的条件

unix - 如何将 gcc 错误重定向到 Unix 中的文件?

c - ar中的 "rcs"选项有什么作用?

c - 如何使用 C 中的链接实现将元素插入和显示到 Dequeue

c++ - 如何在 C 中打印值而不指定它们的类型,就像在 C++ 中使用 "cerr << (A) << endl"一样?

c - 在 C 中默认是 int long int 吗?

c - gcc/clang 对局部变量和结构字段使用限制关键字

gcc 选项 : get start and end addresses of inline functions