问题标签 [newlib]

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 回答
423 浏览

eclipse - 链接器错误 - 使用 Eclipse 3.8.1 在 Debian (Jessie) 上交叉编译 Beaglebone Black

我正在尝试为 BeagleBone Black 设置获取基本的交叉编译器。
我尝试按照本教程进行操作,但遇到了一些障碍......
当下载 arm 平台的工具链时,教程显示“gcc-arm-linux-gnueabi”作为 Ubunto 的一个包,所以我认为 Debian 会有一个。 ..没有骰子,我能找到的最接近的是“arm-none-eabi”包。作为新手,我试了一下。

我按照教程的建议做了一个简单的“Hello World”应用程序,它在标准工具下编译。然而,在交叉工具下,我添加了前缀amr-none-eabi-和路径/usr/bin/,以下是构建的结果。

我似乎找不到任何可以消除这些错误的方法。我将非常感谢我能得到的任何指导。我正在使用 Debian 8.1.0,它是最新的。

0 投票
1 回答
2390 浏览

c - newlib-nano long long 支持

我正在使用 GCC 交叉编译器 (arm-none-eabi-) 为 ARM 架构(裸机)开发程序。为了保持代码较小,我使用“--specs=nano.specs”链接器标志来链接 newlib-nano。我遇到的问题是在 printf 中支持“long long”,即:

添加“-u _printf_float”链接器标志并不能解决这个问题。它确实导致代码大小增加了 9kB,但它似乎只是添加了浮点支持,没有“long long”支持。链接 newlib(删除“--specs=nano.specs”标志)——尽管确实解决了问题——是不可接受的,因为它会导致代码大小增加 46kB。

是否有任何标志仅重新启用对 printf 的 newlib-nano 版本的“long long”支持?

0 投票
1 回答
468 浏览

embedded - 在 newLib 中具有对齐内存的 malloc

我目前正在使用 Atmel 板(SAM4C ARM Cortex-M4)进行项目,我注意到当我设置“陷阱未对齐字访问”位时,我总是遇到“未对齐访问使用错误”。

经过一番调查,我意识到 malloc 返回未对齐的内存块。所以,我想知道是否有一种方法可以配置 malloc 以便它在对齐指针处分配内存?我知道 memalign 可以解决问题,但是由于我使用 malloc 的地方已经太多了,如果我可以继续使用 malloc 会更简单。

我正在使用库“newLib”。

0 投票
1 回答
1245 浏览

c - STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting(newlib 和 libgloss)

我使用 Eclipse CDT 4.5.1 (Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu 的 GnuArmEclipse-Plugin、OpenOCD 0.9.0 和 STM32CubeMX 4.11.0 为 STM32F401C 探索板设置了一个基于 Windows 的工具链。

所以基本上,我使用 STM32CubeMX 生成了一个 SW4STM32 项目,将所有内容导入一个新的 Cross ARM GCC Eclipse C 项目并调整了一些参数,即符号、CPU 类型、FPU 和链接文件。一个简单的 LED 闪烁示例构建成功,可以由 OpenOCD 执行,断点也可以。

为了提供 newlib 或 newlib nano 所需的系统调用,例如_sbrk_write,我从--specs=nosys.specs链接器选​​项开始。这种方式动态内存分配工作得很好。但是,我想自己实现该_write功能,以便打印到显示器或通过 UART 发送数据。

在 libgloss 中,该_write函数有一个弱符号,因此重新实现它应该足够了。我在 main.c 中这样做了:

我预计 LED 会闪烁,但只有主函数本身的切换命令显示效果。

为什么我的 write 函数没有被调用?我错过了什么?

0 投票
2 回答
3863 浏览

c - libc、newlib 和 uclibc 接口之间有区别吗?

我正在尝试使用 newlib 交叉编译 SSH 服务器以将其移植到自制操作系统上(因为操作系统使用基于 newlib 的库)。

我在使用 RedHat Newlib 时遇到了一些问题,我想知道是否可以使用另一个库(例如 uclibc)进行移植?

这 3 个“libc”接口(libc、newlib 和 uclibc)之间有区别吗?

0 投票
1 回答
1189 浏览

c - 为什么将retarget.o归档到静态库时,retarget.c中的“_write”等函数没有链接?

我实现了一个 retarget.c 将 printf 输出重定向到串行端口进行调试,它可以被链接并且工作得很好,如果我的链接命令喜欢这样:

arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs -g -mcpu=cortex-m4 -mthumb -fmessage-length=0 -std=c99 -fno-builtin -Wl,--gc-sections -Wl,-Map=main.map -T"$(LINKERFILE)" -o main.elf main.o retarget.o $(BUILDDIR)/libs.a -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group

但是当我归档retarget.o到归档文件$(BUILDDIR)/libs.a中时,链接命令喜欢这个:

arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs -g -mcpu=cortex-m4 -mthumb -fmessage-length=0 -std=c99 -fno-builtin -Wl,--gc-sections -Wl,-Map=main.map -T"$(LINKERFILE)" -o main.elf main.o $(BUILDDIR)/libs.a -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group

可以链接成功,但是函数printf并没有向串口输出任何东西,看来我自己的版本函数,比如_writeretarget.c中的函数,在最终编译的程序中并没有用到。

0 投票
2 回答
936 浏览

c - 静态库中的 Newlib 存根

我正在使用 Eclipse 开发裸机应用程序。我链接到 newlib,所以我提供了我自己的 _sbrk() 实现。此功能通常包含在我的项目中,并且一切正常。

现在我尝试将此函数移动到我在过去几个月开发的静态库中。

在链接期间,我收到一个undefined reference to _sbrk错误。该文件所在的路径已正确包含在 Eclipse 设置中(同一目录中的其他文件已正确链接)。

显然,链接器通过我的代码的顺序有问题,这个函数被丢弃了。

我尝试使用__attribute__((used)),没有运气。

如何通过 Eclipse 设置克服这个问题?(基于 Makefile 或命令行编译不是我需要的解决方案)。

0 投票
1 回答
155 浏览

c - 静态链接到 newlib 的程序无法在 xv6 中运行

在 xv6 中运行 newlib 链接程序时遇到了一些问题。(是我使用的 newlib 端口)

我使用这个工具链来编译 newlib。编译没有任何问题,我确实得到了 libc.a、libm.a 和其他库文件。

然后我编写了一个 hello world 程序并将它与 newlib 静态链接。该程序就像这样:

但是生成的可执行文件对于 xv6 文件系统来说太大了(这是设计的限制),所以我把它剥离了。剥离后文件大小为 53k,所以现在可以将其放入 fs.

当我运行“make qemu”时,我能够进入系统,并且其他程序运行良好。但是当我运行我的测试程序时,它卡住了几秒钟,然后它说“panic:loaduvm:addr must be page aligned”。是因为我剥离了我的程序,还是我必须对 xv6 源代码应用补丁或修改,或者其他一些原因?

PS 我使用的是来自官方 Github 存储库的最新版本的 xv6,下面是我用来编译测试程序的标志:

0 投票
0 回答
476 浏览

debugging - 在 nano libc 中使用 malloc 调试信息?

我正在使用 gnu arm 工具链,在我的程序中我多次调用 malloc。对 malloc 的调用工作正常,直到它失败。当我检查空闲堆大小和空闲堆栈时,它表明有足够的空间可以分配。问题是我无法从 nano lib 调试 malloc 以查看它卡在哪里,因为 nano-lib 是在没有调试信息的情况下构建的。是否有人可以给我或将我重定向到有关如何使用调试信息重建 GNU ARM 库的有用信息?

谢谢。

0 投票
0 回答
148 浏览

c - 调用 iprintf 导致图像失败

我正在为 Cortex-M3(在 SmartFusion2 中)构建一个小型裸机测试程序。我正在使用 GCC ARM Embedded 工具链(5-20​​16-q1-update)。我在我的main函数中做的第一件事是初始化一个用于调试输出的 UART。然后我将一些字符直接输出到 UART 以指示启动。此 UART 也用于_write_r. main我的函数调用的下一行printf。如果我将其保留为对 的调用printf,因为它没有参数,编译器会将其优化为对的调用puts(即使我指定了 -O0)。这可以正常工作。如果我打电话给iprintf编译器没有对其进行优化,现在我根本看不到任何输出,即使是之前直接调用 UART 也是如此。这表明在启动过程中出现了问题,但我不知道是什么。

总之:

工作正常并nm告诉我printf呼叫已变为puts. 我按预期看到了两行输出。

但是对于以下代码,我根本看不到任何输出:

任何有关从何处开始调试的线索将不胜感激。