我有以下链接描述文件:
.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) 我正在尝试为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指令.
我想忽略所有隐藏文件,但特别是.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) 当我有以下代码时
int main(void) {
printf("%zd\n", strlen("Hello World!"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并用 编译它-O3,strings将显示字符串“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)
使用相同的选项,仍然可以在二进制文件中找到该字符串。
为什么是这样?