我在可执行文件中包含的文件中有一些大型字符串资源。我使用以下命令将它们包含在可执行文件中。 *.S
允许 GCC 调用 as
来生成目标文件,而无需任何特殊处理。
;; ca_conf.S
.section .rodata
;; OpenSSL's CA configuration
.global ca_conf
.type ca_conf, @object
.align 8
ca_conf:
ca_conf_start:
.incbin "res/openssl-ca.cnf"
ca_conf_end:
.byte 0
;; The string's size (if needed)
.global ca_conf_size
.type ca_conf_size, @object
.align 4
ca_conf_size:
.int ca_conf_end - ca_conf_start
我在包含字符串后添加了 .byte 0
以确保字符串以 NULL
终止。这使我可以使用 ca_conf
作为 C const char*
,或 {ca_conf,ca_conf_size}
作为 C++ 字符串。
汇编器或链接器是否会重新排列内容,以便 NULL 终止符可以与其终止字符串分开?或者汇编器和链接器总是将它们保持在一起吗?
最佳答案
因为您使用的是汇编程序,所以它们将保留在一起。 另一点,由于 ALIGN 4 ca_conf_size 可能不是您期望的长度,因此它最多可以包含 3 个填充字节。
关于c - 通过 AS 的 incbin 指令包含的字符串上的 NULL 终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21493504/