小编soc*_*ser的帖子

尝试与静态 c 标准库链接时出错

我的操作系统是 ubuntu 14.04 32 位,我的源程序 test.c 是:

#include <stdio.h>
int main(int argc, char *argv[])
{
        printf("test.");
        return;
}
Run Code Online (Sandbox Code Playgroud)

我用命令编译它:

gcc -S test.c
Run Code Online (Sandbox Code Playgroud)

输出为 test.s 文件。我用命令组装它:

as -o test.o test.s
Run Code Online (Sandbox Code Playgroud)

然后我想将它与 c 标准库静态链接。我搜索了libc.a文件,将其定位在/usr/lib/i386-linux-gnu/libc.a. 所以我试图将它与命令链接:

ld test.o /usr/lib/i386-linux-gnu/libc.a
Run Code Online (Sandbox Code Playgroud)

但出来了很多错误信息:

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048210
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `backtrace_helper':
(.text+0x20): undefined reference to `_Unwind_GetIP'
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `backtrace_helper':
(.text+0x45): undefined reference to `_Unwind_GetGR'
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `backtrace_helper':
(.text+0x50): undefined reference to `_Unwind_GetCFA'
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In …
Run Code Online (Sandbox Code Playgroud)

c assembly linker static-libraries

5
推荐指数
1
解决办法
2066
查看次数

为什么这些实模式代码可以在虚拟机上运行,​​而在我的真机上不运行?

我正在尝试将汇编代码写入 mbr 以使用 BIOS ISR。我将以下代码写入 mbr,希望在屏幕上打印字符“ABCD”:

mov ah,0x0e
mov bp,0x8000
mov sp,bp

push 'A' 
push 'B'
push 'C'
push 'D'

mov al, [0x7ffe]
int 0x10

mov al, [0x7ffc]
int 0x10

mov al, [0x7ffa]
int 0x10

mov al, [0x7ff8]
int 0x10

; infinite loop
jmp $

; padding 0s and set the  magic number to make it bootable
times 510 -( $ - $$ ) db 0     
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

这些代码在 bochs 或 qemu 模拟器上运行良好,但是当我写入我的真实磁盘并使用它来引导时,没有打印任何内容。我已经测试过将 %al 寄存器直接设置为 chars ,并且打印效果很好。我使用的是 AMD PhenomII 955 …

x86 assembly mbr x86-64 real-mode

2
推荐指数
1
解决办法
163
查看次数

如何在 Linux 中下载单个网页以完全离线查看?

我想完全离线下载一些网页,以便稍后查看,只是单个页面,而不是整个网站。但是我在网上找不到可用的解决方案。

\n\n

我看到一些建议使用该wget -E -H -k -K -p url命令的答案。但这根本没有解决问题。因为它从其他网站下载很多很多页面。

\n\n

我\xe2\x80\x99ve也尝试了cURL命令,但该页面没有完全离线保存,当用Firefox打开它时,它不断加载其他地址,因此没有互联网连接就无法查看。

\n\n

我只是希望单个页面完全离线,这样即使原始网站关闭我也可以查看它。将示例页面 url 设为:

\n\n
http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash\n
Run Code Online (Sandbox Code Playgroud)\n

curl wget

2
推荐指数
1
解决办法
2778
查看次数

当-1无法在char中表示时,为什么EOF定义为-1?

我正在学习覆盆子pi上的C编程,但是我发现我的程序从未成功捕获EOF.我char c=0; printf("%d",c-1);用来测试char类型,发现char类型范围从0到255,作为unsigned short.但EOF定义的stdio.h是(-1).我的Pi上安装了错误的cc包吗?我该怎么解决?如果我手动更改了EOFstdio.h,还会有进一步的问题吗?


令我担心的是,当我从K&R书中学习时,有一些例子使用了代码while ((c=getchar())!=EOF),我在我的Ubuntu机器上跟着它,它工作正常.我只是想知道现代C语言是否放弃了这种语法,或者我的Raspberry Pi中是否存在冲突?

这是我的代码:

#include <stdio.h>
int main( void )
{
        char c;
        int i=0;
        while ((c=getchar())!=EOF&&i<50) {
                putchar(c);
                i++;
        }
        if (c==EOF)
                printf("\nEOF got.\n");
        while ((c=getchar())!=EOF&&i<500) {
                printf("%d",c);
                i++;
        }
}
Run Code Online (Sandbox Code Playgroud)

即使我将输入重定向到文件,它仍然在屏幕上打印255,永远不会终止此程序.


最后我发现我错了,在K&R书中,它将c定义为int,而不是char.问题解决了.

c char eof

1
推荐指数
1
解决办法
183
查看次数

标签 统计

assembly ×2

c ×2

char ×1

curl ×1

eof ×1

linker ×1

mbr ×1

real-mode ×1

static-libraries ×1

wget ×1

x86 ×1

x86-64 ×1