问题标签 [freestanding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
293 浏览

c - 实模式 DOS .COM(独立式)的自定义内存分配器——如何调试?

先介绍一点背景知识:偶然发现这篇博文,我了解到可以.COM使用 GNU 链接器创建 DOS 文件,这甚至不是火箭科学。使用clangand-m16开关(通过相应地为 32 位指令添加前缀来创建与实模式兼容的 32 位代码),效果很好。所以我有想法尝试实现足够的运行时来获得我最近编写的一个小诅咒游戏.COM,以编译为 a并在实模式DOS 中运行。游戏足够小,因此将所有内容(文本、数据、bss、堆、堆栈)压缩为 64KB 似乎是可行的。当然,它使用malloc(). 所以我必须想出我自己的实现。这是它的样子:

_heap符号由链接器定义。未realloc()在此处显示,因为它现在无论如何都没有使用(因此完全未经测试)。

现在的问题是:我在这里创建了我的运行时(malloc 在 src/libdos/stdlib.c 中),写了很多测试内容,最后,一切似乎都运行良好。另一方面,我的游戏使用valgrind. 尽管如此,将这两个部分放在一起,它还是会崩溃。(尝试使用 git 从 git 构建游戏make -f libdos.mk,您需要安装 llvm/clang)。

由于我首先遇到了一个奇怪的heisenbug (我现在正在解决它),我想这可能是优化器在为实模式编译时出错了,这确实不常见。但我不能确定,下一个敏感的候选人可能是我的内存管理,见上文。

现在棘手的问题是:我将如何调试这样的东西?仅使用我自己的测试代码,它就可以很好地工作。我无法在没有优化的情况下编译我的游戏,因为这样做会超过 64KB。有什么建议么?或者任何人都可以发现上面的代码明显有问题吗?

0 投票
1 回答
142 浏览

c++ - C 库的一个端口是否需要在 C 中实现?

我正在研究内核。编写内核的任务之一是必须移植 C 库。必须重写一些函数,例如memcmp,strlen等等。大多数时候我会看到用 C 编写的代码,然后用extern "C". 但是,这使我的构建过程变得复杂,因为有很多用 C 编写的文件,还有很多用 C++ 编写的文件,它们必须链接在一起,这只是一个令人头疼的问题。如果整个东西都可以用 C++ 编写,那就太好了。

这有意义吗?

0 投票
1 回答
744 浏览

c - 如何在 OSX 中将 C 编译为原始二进制文件?

我正在关注如何从头开始创建操作系统的教程。我现在需要开始用 C 语言编写代码,但我需要以独立模式将其编译为原始二进制文件。给出的命令是:

第一个命令有效,第二个无效。OSX 的链接器对 -Ttext 一无所知。任何人都知道在不使用虚拟 linux 系统的情况下解决这个问题的方法吗?一定有办法的。

objcopy 也不起作用。

0 投票
2 回答
211 浏览

c++ - 使用 GNU 编译器在独立 C++ 中将 uintx_t 转换为 const char*

所以我试图将一些整数转换为我的终端可以写入的字符数组。所以我可以在运行时看到我的代码计算值以进行调试。就像 int_t count = 57 我希望终端写 57。所以 char* 将是 5 和 7 的字符数组

不过这里的关键是这是在一个独立的环境中,所以这意味着没有标准的 c++ 库。编辑:这意味着没有 std::string,没有 c_str,没有 _tostring,我不能只打印整数。

我可以访问的标头是 iso646、stddef、float、limits、stdint、stdalign、stdarg、stdbool 和 stdnoreturn

我已经尝试了一些将 int 转换为 const char* 的方法,女巫只是导致显示随机字符。从 GCC 集合中为我的编译器提供不同的头文件,但他们只是一直需要其他头文件,我继续提供它,直到我不知道编译器想要什么头文件。

所以这里是需要打印代码的地方。

对此的任何建议将不胜感激。

我正在使用针对 686-elf 的 gnu、g++ 交叉编译器,我想我正在使用 C++11,因为我可以访问 stdnoreturn.h 但它可能是 C++14,因为我只是用最新的编译器构建了gnu 软件依赖项。

0 投票
2 回答
144 浏览

c - 如果某物是 const volatile int,它可以根据变量的状态而改变吗?

我有一个unsigned const volatile short int*. 我希望它是 (x + y),在定义时设置为 0。但是,我希望如果由于某种原因 y 更改为 5,我也希望unsigned const volatile short int*更改。

这在C中可能吗?

(注意:我使用的是带有 GNU 扩展的独立 C99 模式,我的意思是它会自动更改,而不是使用函数。)

0 投票
1 回答
1141 浏览

c++ - C++ 独立功能

我可以在 C++ 独立环境中使用哪些功能?我正在开发一个小内核(为了我自己的乐趣),我知道我不能使用整个 stdlib 库,但还有什么?当我尝试使用 new 和 delete 运算符时,它编译时没有问题,但链接器说

我链接-lgcc-lsupc++选项。我知道异常处理在独立中是禁用的,但我有点惊讶 new 和 delete 也是。那么我可以使用什么,不能使用什么?

0 投票
0 回答
237 浏览

c - 使用 set_pixel 函数打印字母 (c)

我有一个set_pixel函数(一个在示例显示器中设置像素颜色的函数),我只有这种输出方法才能打印到显示器。

我试图在屏幕上打印一些字符以进行调试和其他一般用途,但我发现完成此操作的唯一方法是逐像素打印每个字母,考虑到我将使用大写字母和数字,这是一件非常缓慢且乏味的事情.

例如,这是一些用于打印带有set_line由该函数组成的简单函数的“A”的set_pixel代码。

为此C,我在一个环境中使用我的语言freestanding,没有标准库,比如<stdio.h>或任何类型的库,但我可以重新实现我猜想的东西或移植一些库。

我如何在不逐像素或逐行的情况下做到这一点?提前致谢!

0 投票
1 回答
570 浏览

c - 错误:此处声明的函数 'ms_abi' 之前声明的没有调用约定(clang)

当我尝试编译包含另一个 C 标头的 C 代码时,我收到此错误:

编译器是clang,涉及的文件如下:
memcmp.c

string.h

systemapi.h(typedefs 只是定义 uintx_t 类型)

另一个标题包括string.hlibk.h

以及包含 lib.h 并且在编译时报告错误的文件,main.c(但所有文件在链接时都报告错误lib.h

编译器的标志:-I/usr/include/efi -I/usr/include/efi/x86_64 -I/usr/include/efi/protocol -fno-stack-protector -fpic -fshort-wchar -mno-red-zone -DHAVE_USE_MS_ABI -c main.c -o main.o

0 投票
2 回答
65 浏览

c - 制作一个函数来根据参数选择一个接口

我想在 C 中创建一个函数来选择另一个函数,也许这个 C 伪代码可以帮助澄清我想要什么:

目标是在满足条件时为函数分配“别名”,我该怎么做?

我为此使用了一个独立的 C 实现,用 clang 编译。

0 投票
1 回答
429 浏览

c++ - 在独立模式c ++的分隔符处拆分char *

我正在尝试编写自己的操作系统。我已经按照 OSDev Wiki 上的教程进行操作,现在我正在编写带有命令的控制台模式。我需要能够将 a 拆分char*为 a char**,而不需要所有库功能(因此是独立的)。我已经尝试迭代直到遇到分隔符等,但是无论我做什么,我都会在第一个结果的末尾遇到垃圾。我究竟做错了什么?这是我到目前为止所拥有的:

我在问一个关于如何在 C++ 独立模式下编写特定函数的问题。