刚发现 C 语言命名初始化语法糖(Designated Initializers)依赖标准库的 memset 和 memcpy

2023-07-02 16:50:39 +08:00
 yuanix
struct proc test_proc_1 = {
      .name = "test_proc_1",
      .pid = 1,
      .hartid = 0,
      .state = PROC_READY,
      .cpu = {
          .pc = (u64)&test_proc_1,
      }};

这段代码在链接的时候提示:

undefined reference to `memset'
undefined reference to `memcpy'

让 ChatGPT 给我实现了一下,编译链接进去就好了。

#include "kstring.h"

void *memset(void *s, int c, size_t n)
{
  unsigned char *p = s;
  while (n--)
    *p++ = (unsigned char)c;
  return s;
}

void *memcpy(void *dest, const void *src, size_t n)
{
  unsigned char *d = dest;
  const unsigned char *s = src;
  while (n--)
    *d++ = *s++;
  return dest;
}
1598 次点击
所在节点    分享发现
10 条回复
nightwitch
2023-07-02 17:26:43 +08:00
特定编译器的表现吧
zhng920823
2023-07-02 17:58:57 +08:00
你这是写单片机程序还是别的不依赖操作系统的程序?
按说即便以来依赖这个也是默认连接上了啊。
zhng920823
2023-07-02 18:03:41 +08:00
写了个类似的程序, 但是分析程序连接的库函数后, 没有发现依赖 memset memcpy
也可能优化掉了,虽然用了 -O0
yuanix
2023-07-02 18:21:05 +08:00
@zhng920823 不依赖操作系统的,写个玩具 kernel
LaTero
2023-07-02 19:00:30 +08:00
会不会是你的初始化顺序和字段的定义顺序不一样?不一样的时候 gcc 会报警告 iso c++不支持,可能是 gnu 拓展会到用 memset 和 memcpy 。我没有 freestanding 开发经验,瞎猜的。
zhng920823
2023-07-02 20:29:19 +08:00
@yuanix #3 仰望大佬 是给 X86 机器写的还是给那些嵌入式设备写的? 有没有 github 地址
yuanix
2023-07-02 21:02:26 +08:00
@zhng920823 小菜鸡一个,摸鱼了解一点新东西,为 QEMU 模拟器的虚拟 RISC-V 设备写,刚开始写: https://github.com/peiyuanix/yuanix-riscv-os ,欢迎一起交流学习呀
zagfai
2023-07-02 21:27:08 +08:00
确实是会影响性能~
agagega
2023-07-03 15:52:13 +08:00
没有装到 RISCV 的 cross GCC ,试了下 clang 和其他平台的 GCC ,没发现有这个行为。可以试试加上 -fno-builtin 和 -ffreestanding
yuanix
2023-07-03 17:50:08 +08:00
@agagega 试了一下加上还是要,明确指出初始化那行代码需要依赖 `memset`。

我用的是 Debian ,riscv64-gcc 包名是 `gcc-riscv64-linux-gnu`

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/953440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX