- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试在 ARM 裸机程序中的 C 代码中使用 % 时,它需要 libgcc 的包装器。没问题,我可以链接它。当我这样做时,链接器停止提示,但是程序在 mod 使用时挂起(如果我观察寄存器,它们实际上开始以莫名其妙的方式循环)。用 % 注释掉该行会使程序不会以这种方式挂起,所以这肯定是问题所在。
我在 https://gist.github.com/1724746 构建了一个简单的问题示例。
我使用以下方式运行测试:
qemu-system-arm -M versatilepb -cpu arm1176 -nographic -kernel kernel.elf | xxd
然后 ^a-x 退出它,并注释掉 % 行,我得到了我期望的输出字节,但是使用那里的行我没有得到任何这样的输出。
知道这里发生了什么吗?
编辑:我使用的交叉编译器是 Ubuntu 上的默认设置:https://launchpad.net/gcc-linaro
最佳答案
所以它用 2 加载 r0 和 r1(它对当前任务+1 执行加一操作
10648: e1a00003 mov r0, r3
1064c: e51b1010 ldr r1, [fp, #-16]
10650: eb00fd36 bl 4fb30 <____aeabi_uidivmod_veneer>
我猜他们用_veneer从 ARM 切换到拇指,它是一个切换模式的蹦床:
0004fb30 <____aeabi_uidivmod_veneer>:
4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4>
4fb34: 00010905 .word 0x00010905
这将带您到这里,实际的模运算,这是拇指代码,拇指模式
00010904 <__aeabi_uidivmod>:
10904: 2900 cmp r1, #0
10906: d0f8 beq.n 108fa <__aeabi_uidiv+0x252>
10908: e92d 4003 stmdb sp!, {r0, r1, lr}
1090c: f7ff fecc bl 106a8 <__aeabi_uidiv>
10910: e8bd 4006 ldmia.w sp!, {r1, r2, lr}
10914: fb02 f300 mul.w r3, r2, r0
10918: eba1 0103 sub.w r1, r1, r3
1091c: 4770 bx lr
1091e: bf00 nop
所以它看起来会进行正常的除法,然后将结果相乘并相减
12345 % 100 = 12345 - ((12345/100)*100) = 12345 - (123*100) = 12345 - 12300 = 45
我想知道问题是否出在拇指模式上。 arm1176肯定有thumb模式,真正的,而且我qemu可以做thumb。
你可以尝试一个实验来找出汇编和链接:
.thumb
.thumb_func
.globl thumb_test
thumb_test:
add r0,#1
bx lr
arm-none-linux-gnueabi-as thumb_test.s -o thumb_test.o
或者任何你的工具链前缀(如果有),并将 .o 文件与其他所有内容链接起来。
在C代码中将其声明为
unsigned int thumb_test ( unsigned int );
无论你传递什么,你都应该得到该值加一……尝试这个而不是模数。
要尝试的另一件事是直接除法,看看除法是否有效但不能取模,也许问题在于乘法指令?谁知道呢。
嗯嗯,我想我看到了问题:
0004fb30 <____aeabi_uidivmod_veneer>:
4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4>
4fb34: 00010905 .word 0x00010905
您无法使用 ldr 切换模式,它必须是 bx 或 blx,当它尝试在 Arm 模式下执行拇指代码时,它可能会转到未定义的处理程序。
我有一些关于切换模式如何工作的示例,特别是为 qemu 编写的。现在这是一个低级示例,例如没有 printf,我确实有 uart 输出,可以通过一种方式查看 uart 上的内容。如果这是问题所在(切换到拇指模式),那么您需要检查如何编译和链接程序。如果您不使用以前的代码源(现在由导师图形使用)工具链,您可能需要指定交互工作,或者可能需要了解工具链的构建方式。假设您正在使用基于 gnu/gcc 的东西。
如果你有办法在其中放置一个未定义的处理程序,或者如果你能够观察跟踪并看到 pc 下降到地址 0x0000000 附近的某个位置,那么这可能就是正在发生的情况。如果你用我的小拇指测试东西构建,并且它使用 ldr 而不是 bx 来到达那里,那么这应该不起作用,它仍然应该崩溃......
关于gcc - 裸机 mod (%) 在带有 libgcc 的 ARMv6 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117046/
据我所知,libgcc 实现了一些 libc 函数,当程序使用内置函数并且 gcc 决定不通过某些内联汇编实现它时调用这些函数。然而,是否有可能让 gcc 始终将所有内置函数作为对 libgcc 的调
我正在尝试为 i386-elf 目标构建 gcc 4.6。 我的问题如下。编译 libgcc 时,我得到了使用全局偏移表的 output-file _fixunsdfdi.o。 该函数用于将 'dou
我一直在 Mac OS X 10.6 上使用 GCC 4.6.2。我在编译时使用 -static-libgcc 选项,否则我的二进制文件会在系统上寻找 libgcc,我不确定 OS X 是否支持 GC
我正在用 C++ 编写一个 Windows DLL。这个库只有 C 接口(interface),并且只使用也有 C 接口(interface)的标准 Windows 库。因此,将所有 C++ 库静态链
当我编译一个二进制文件时,即使我有依赖项,我仍然会收到以下错误。 /usr/bin/ld: 找不到 -l-static-libgcc /usr/bin/ld: 找不到-l-static-libstdc
我正在尝试编译 zbar-0.10 以静态链接到 MinGW 依赖项,因此它不需要 libgcc_s_dw2-1.dll、libwinpthread-1.dll 和 libstdc++-6.dll。
我有一个带有为目标平台编译的 libgcc 的交叉编译器,但不存在标准 C 库。 libgcc 依赖于哪些函数,我在哪里可以找到这些信息? 最佳答案 这些是 libgcc 所依赖的 C 函数:: 强
我目前正在尝试将我所有应用程序的依赖项编译为静态库。我的动机: 不依赖任何操作系统提供的库以拥有完美可重现的代码库 避免在其他系统上部署时由动态链接引起的问题 在链接不同版本的库时避免运行时冲突 能够
我们已经使用 RPM 文件在 AIX 6.1 上安装了 GCC 和 libgcc。 我想知道的是为什么“libgcc_s.a”没有创建在下面的文件夹下? /opt/freeware/lib/gcc/p
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我正在尝试安装交叉编译器,this tutorial ,当我想制作 libgcc 时,我只是把 make all-target-libgcc在我的终端。这会抛出错误 checking whether
我正在尝试生成一个不依赖于 libc(或任何其他)的可执行文件。首先,我这样做了: // test.c void _start() { // write(1, "hello!\n", 7);
我正在尝试使用 Google Toolchain 为我的 Android 手机独立编译内核,并且已经尝试过 Uber 和 linarc。 他们都给出了同样的错误,我不明白: /home/aayushg
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
int main(int argc, char **argv) { return 0; } 我交叉编译(host=linux x86_64,target=linux aarch64) /pat
我一直在使用clang-3.5愉快地构建musl libc的位码版本和使用结果生成漂亮的独立可执行文件。 最近对clang-3.8的尝试并不那么令人满意。看起来位代码 clang-3.8 生成使用 中
我正在尝试为 Android 交叉编译一个非常简单的程序,该程序适用于 android-ndk-r6b 和之前的版本,但不适用于 android-ndk- r7 及更新版本: int main() {
我正在尝试构建 GCC 4.7.3。当我用相当旧的系统 GCC 4.1 构建它时,一切正常,我得到了 GCC 4.7.3。但是当我试图用刚刚编译的 GCC 4.7.3(实际上是自己构建)重建它时,我遇
我尝试使用 -static -static-libgcc -static-libstdc++ 编译项目,以便静态链接库。但是,exec 是用动态链接库编译的。我尝试重新安装 gcc 和 g++ 但它没
我在将 libgcc 链接到静态链接 .so 时遇到问题 它仅在使用 -m64 链接 64 位模块时发生 Ubuntu 64 位 12.10 gcc 4.7 在 Ubuntu 64 位 12.04 g
我是一名优秀的程序员,十分优秀!