【问题标题】:Manually compile using gcc -v使用 gcc -v 手动编译
【发布时间】:2011-08-11 12:53:49
【问题描述】:

是否可以编译一个只使用提供的 gcc/glibc 文件而不使用操作系统提供的默认文件的简单 Hello World 程序? (因此,执行时,程序将只使用提供的文件,而不是操作系统提供的文件。)我在网上到处找,但没有任何工作:

我尝试手动执行此操作 gcc -v simple.c,但我自己无法重现它。

这是我尝试过的:(所有提供的文件都在桌面上)

 /home/myuser/Desktop/cc1 -quiet -v simple.c -quiet -dumpbase simple.c -mtune=generic -auxbase simple -version -o /tmp/temp1.s

如何将以下路径更改为自定义路径而不是默认路径?

忽略不存在的目录“/usr/local/include/x86_64-linux-gnu” 忽略不存在的目录“/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../x86_64-linux-gnu/include” #include "..." 搜索从这里开始: #include 搜索从这里开始: /usr/local/包括 /usr/lib/gcc/x86_64-linux-gnu/4.4.5/include /usr/lib/gcc/x86_64-linux-gnu/4.4.5/include-fixed /usr/include/x86_64-linux-gnu /usr/包括 搜索列表结束。 GNU C (Debian 4.4.5-8) 版本 4.4.5 (x86_64-linux-gnu) 由 GNU C 版本 4.4.5、GMP 版本 4.3.2、MPFR 版本 3.0.0-p3 编译。 GGC 启发式:--param ggc-min-expand=100 --param ggc-min-heapsize=131072 编译器可执行校验和:dac4d891d068d1bed01868869b00bd17
as -V -Qy -o /tmp/temp2.o /tmp/temp1.s
GNU 汇编器版本 2.20.1 (x86_64-linux-gnu) 使用 BFD 版本 (GNU Binutils for Debian) 2.20.1-system.20100303
/home/myuser/Desktop/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker ld-2.11.2.so crt1.o crti.o crtbegin.o /tmp/temp2.o libgcc.a --as-needed libgcc_s.so.1 --no-as-needed libc.a libgcc_s.so.1 --as-needed libgcc.a --no-as-needed crtend.o crtn.o

为什么使用下面的 /usr/bin/ld 而不是提供的 ld-2.11.2.so ?

/usr/bin/ld: 动态 STT_GNU_IFUNC 符号 `strcmp' 在 `libc.a(strcmp.o)' 中具有指针相等性,不能在制作可执行文件时使用;使用 -fPIE 重新编译并使用 -pie 重新链接 collect2: ld 返回 1 个退出状态

任何人都可以修改它来工作吗?

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    -v 显示编译器驱动程序执行的操作。它不会影响您获得的标准库。

    要使用所有自定义库运行,请使用-nostdlib

    【讨论】:

    • 我试过了,它也不起作用:gcc -nostdlib /home/myuser/Desktop/libgcc.a /home/myuser/Desktop/libc.a simple.c /usr/bin/ld :警告:找不到入口符号_start;默认为 0000000000400144 /tmp/ccDFp8hh.o:在函数 main': simple.c:(.text+0x1d): undefined reference to memcpy' simple.c:(.text+0x29):未定义对“puts”的引用 collect2:ld 返回 1 个退出状态
    • @Janet:您需要在库路径名前加上-l,例如-l/home/myuser/Desktop/libgcc.a
    【解决方案2】:

    如何将以下路径更改为 自定义的而不是默认的?

    只需将-I path 添加到编译器调用。此路径将添加到内部路径之前。

    为什么使用下面的/usr/bin/ld 而不是提供的 ld-2.11.2.so ?

    第一个是可执行二进制文件,第二个是共享对象。您不能使用共享对象代替二进制文件。

    【讨论】:

    • @Janet 你的意思是链接错误?那是因为您没有使用与位置无关的可执行文件支持进行编译。但我认为这就是你想要做的。 -I 当然只修改包含路径。当然包括路径与链接无关。请尝试解释您要达到的目标。从你的问题看不清楚。
    猜你喜欢
    • 2022-11-08
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多