小编use*_*684的帖子

如何获取输入节的大小(将其放置在内存的末尾)

我有以下链接描述文件: .data.bss放在ram中,然后一.heap节填充剩余的内存。

现在,我想添加一个.noinit始终放在内存末尾的节。因此,它会被引导加载程序等忽略。

我仍然希望我的.heap部分占据.bss和之间的所有可用空间.noinit,但是为此,我需要知道.noinit部分的大小。

天真的方法失败了:

/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
    . = ALIGN(4);
    _sbss = . ;
    _szero = .;
    *(.bss .bss.*)
    *(COMMON)
    . = ALIGN(4);
    _ebss = . ;
    _ezero = .;
} > ram

/* heap section */
.heap (NOLOAD) :
{
    . = ALIGN(4);
    _sheap = . ;
    . = ORIGIN(ram) + LENGTH(ram) …
Run Code Online (Sandbox Code Playgroud)

ld

28
推荐指数
1
解决办法
750
查看次数

未定义引用`__aeabi_ddiv'和朋友 - 没有stdlib但是-mfloat-abi = hard

我正在尝试为Cortex-M4F构建一个项目.芯片有一个FPU,所以我正在构建,-mfpu=fpv4-sp-d16 -mfloat-abi=hard我没有使用任何库来节省空间,所以我这样做-nostdlib -fno-builtin.

现在我想使用浮点运算,但是这样做时我得到一个链接器错误:

led1642gw_gain.c:(.text.led_calculateGain+0xc): undefined reference to `__aeabi_f2d'
led1642gw_gain.c:(.text.led_calculateGain+0x24): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0x36): undefined reference to `__aeabi_dsub'
led1642gw_gain.c:(.text.led_calculateGain+0x48): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0x54): undefined reference to `__aeabi_d2f'
led1642gw_gain.c:(.text.led_calculateGain+0x9e): undefined reference to `__aeabi_f2d'
led1642gw_gain.c:(.text.led_calculateGain+0xb6): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0xc8): undefined reference to `__aeabi_dsub'
led1642gw_gain.c:(.text.led_calculateGain+0xda): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0xe6): undefined reference to `__aeabi_d2f'
led1642gw_gain.c:(.text.led_calculateGain+0x10c): undefined reference to `__aeabi_f2d'
Run Code Online (Sandbox Code Playgroud)

这是为什么?如果我理解正确,它不应该依赖库函数,而是使用ARM本机FPU指令.

gcc arm cortex-m

8
推荐指数
1
解决办法
3059
查看次数

为什么找到.-not -name".*"不排除隐藏文件?

我想忽略所有隐藏文件,但特别是.git和.svn在搜索(以及后来替换)文件时,我没有发现排除许多在线教程中描述的隐藏文件的最基本方法在这里不起作用.

find . -not -name ".*"
Run Code Online (Sandbox Code Playgroud)

还会打印隐藏文件.

我正在尝试编写的脚本是

replace() {
    if [ -n "$3" ]; then expr="-name \"$3\""; fi
    find . -type f \( $expr -not -name ".*" \) -exec echo sed -i \'s/$1/$2/g\' {} \;
    unset expr
}
Run Code Online (Sandbox Code Playgroud)

bash replace find

5
推荐指数
1
解决办法
6975
查看次数

gcc 何时在编译时评估函数?

当我有以下代码时

int main(void) {
        printf("%zd\n", strlen("Hello World!"));

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

并用 编译它-O3strings将显示字符串“Hello World!” 二进制文件中缺少它,因为它在编译时进行了评估。

如果我改为使用我自己的函数

static inline size_t my_strlen(const char *s) {
        const char *tmp = s;

        while (*++tmp);

        return tmp - s;
}

int main(void) {
        printf("%zd\n", my_strlen("Hello World!"));

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用相同的选项,仍然可以在二进制文件中找到该字符串。

为什么是这样?

c gcc

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

标签 统计

gcc ×2

arm ×1

bash ×1

c ×1

cortex-m ×1

find ×1

ld ×1

replace ×1