相关疑难解决方法(0)

1511
推荐指数
11
解决办法
72万
查看次数

为什么我们需要在C++中使用extern"C"{#include <foo.h>}?

为什么我们需要使用:

extern "C" {
#include <foo.h>
}
Run Code Online (Sandbox Code Playgroud)

特别:

  • 我们什么时候应该使用它?

  • 在编译器/链接器级别发生了什么,需要我们使用它?

  • 如何在编译/链接方面解决了需要我们使用它的问题?

c++ name-mangling linkage extern-c

133
推荐指数
10
解决办法
8万
查看次数

引导仍然需要外部支持

我听说过引导一种语言的想法,就是为这种语言编写一个编译器/解释器.我想知道如何实现这一点,并且看了一下,看到有人说它只能通过其中任何一个来完成

  • 用不同的语言编写初始编译器.
  • 在Assembly中手动编写初始编译器,这似乎是第一个特例

对我来说,这些似乎都不是真正引导语言,因为它们都需要外部支持.有没有办法用自己的语言编写编译器?

compiler-construction bootstrapping

93
推荐指数
6
解决办法
2万
查看次数

R_X86_64_32S和R_X86_64_64重定位是什么意思?

当我尝试在64位FreeBSD中编译C应用程序时出现以下错误:

在制作共享对象时不能使用重定位R_X86_64_32S; 用-fPIC重新编译

什么是R_X86_64_32S搬迁,什么是R_X86_64_64

我已经用Google搜索了错误,这可能是原因 - 如果有人能说出R_X86_64_32S的真正意义,那就太好了.

c compiler-construction linker elf relocation

49
推荐指数
3
解决办法
3万
查看次数

如何手动编写和执行Windows .exe(使用Hex编辑器的机器代码)?

我想知道如何通过使用十六进制编辑器来编写像Hello World程序这样简单的东西是可能的.我知道我可以在近机器级别使用汇编语言和汇编语言,但我只想尝试在Hello World这样的玩具示例中编写机器代码.

这可能是一个简单的DOS .COM文件,我可以在DOSBox上运行.但是,如果有人可以提供.EXE文件的示例,直接在我的Windows PC上运行它会很好.

这只是纯粹的好奇心.不......我不打算直接用二进制机器代码编写程序(我甚至不编写汇编代码,我只是在大多数时候使用C/C++作为我最低级的工具).我只是想知道是否可以这样做,因为可能有人必须在计算机的早期阶段做到这一点.

PS:我知道关于这个话题有类似的问题,但没有提供一个有效的例子.我只想要一个简单的例子,以便它可以帮助我理解编译器和汇编器如何生成可执行文件.我的意思是......在过去的第一个项目中,有人必须亲手完成.此外,对于Windows EXE格式,Microsoft必须有人编写第一个生成格式的工具以及Windows本身读取它然后执行它的方式.

windows executable exe machine-code

37
推荐指数
4
解决办法
3万
查看次数

内核如何获得在linux下运行的可执行二进制文件?

内核如何获得在linux下运行的可执行二进制文件?

这似乎是一个简单的问题,但任何人都可以帮助我深入挖掘?如何将文件加载到内存以及如何启动执行代码?

任何人都可以帮助我,一步一步地告诉我们发生了什么吗?

c linux

26
推荐指数
4
解决办法
1万
查看次数

如何与GCC进行弱连接工作?

似乎有3种方法告诉GCC弱连接符号:

  • __attribute__((weak_import))
  • __attribute__((weak))
  • #pragma weak symbol_name

这些都不适合我:

#pragma weak asdf
extern void asdf(void) __attribute__((weak_import, weak));
...
{
    if(asdf != NULL) asdf();
}
Run Code Online (Sandbox Code Playgroud)

我总是得到这样的链接错误:

Undefined symbols:
  "_asdf", referenced from:
      _asdf$non_lazy_ptr in ccFA05kN.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

我在OS X 10.5.5上使用GCC 4.0.1.我究竟做错了什么?

c linker gcc weak

23
推荐指数
4
解决办法
4万
查看次数

汇编语言中的全局_start是什么?

这是我的汇编级代码......

section .text
global _start
_start: mov eax, 4
        mov ebx, 1
        mov ecx, mesg
        mov edx, size
        int 0x80
exit:   mov eax, 1
        int 0x80
section .data
mesg    db      'KingKong',0xa
size    equ     $-mesg
Run Code Online (Sandbox Code Playgroud)

输出:

root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out 
KingKong
Run Code Online (Sandbox Code Playgroud)

我的问题是全球_start用于什么?我和Mr.Google试了一下运气,我发现它用来说明程序的起点.为什么我们不能_start告诉程序在哪里开始,如下面给出的那个在屏幕上产生一种警告

section .text
_start: mov eax, 4
        mov ebx, 1
        mov ecx, mesg
        mov edx, size
        int 0x80
exit:   mov eax, 1
        int 0x80
section .data …
Run Code Online (Sandbox Code Playgroud)

assembly nasm

23
推荐指数
3
解决办法
3万
查看次数

NASM中equ和db之间有什么区别?

len:  equ  2
len:  db   2
Run Code Online (Sandbox Code Playgroud)

它们是否相同,产生的标签可以代替2?如果没有,那么每份申报表的优缺点是什么?它们可以互换使用吗?

nasm

20
推荐指数
3
解决办法
1万
查看次数

如何从源代码编译我自己的glibc C标准库并使用它?

我正在尝试编译自己的glibc.我有一个目录glibc,其中包含glibc我从互联网上下载的源代码.从我输入的目录中输入mkdir ../build-glibc.现在从build-glibc我输入的目录../glibc/configure中执行配置.现在我不知道怎么打电话make.我无法从glibc目录中调用它,因为它没有配置集,也不能从中调用它build-glibc,因为makefile不在该目录中.我该如何解决这个问题?

c linux gcc glibc x86-64

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