问题标签 [data-segment]
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.
c - 为什么全局变量存储在堆中?
为什么在下面的示例中,全局变量存储在堆段中,而不是 data/bss 段中?
从 maps 伪文件的以下输出来看,data/bss 段是第 3 行。这是因为它是读/写和匿名的。以下 2 个条目是堆(如标签所示)。
这是 /proc//maps 的输出:
但是,当我打印 2 个全局变量的位置时,我得到以下属于堆 vm 区域的地址:
我使用以下方法打印位置:
assembly - 用于读取 BIOS 数据段的 intel 到 ATT 汇编转换
以下英特尔代码的等效 ATT 代码是什么:
linux - 程序执行期间的数据段
怀疑:
如果我们执行一个程序,以下是分配给该程序的内存类型。
在这里,数据段起着至关重要的作用。所有已初始化的数据和未初始化的数据都存在于数据段中。但是,我不知道数据段中数据的存储顺序。例如,初始化数据、未初始化数据、只读数据和读写数据。我认为以上是数据段中存在的四种类型。
所以,数据将按什么顺序放置在数据段中。就像地址少于所有的第一个初始化数据一样。接下来是未初始化的数据,它们的地址比初始化的数据高。
提前致谢。
c - 在C中打印字符数组
我知道我应该把'/o'放在字符数组的末尾但是当我想打印“printf(”%s\n“,kk);” ,它给出“abcdepqrst”。为什么会这样?这是我正在执行的程序。
输出:
pqrst
abcdepqrst
我尝试通过在此处的数组“kk”之前声明数组“s”来颠倒声明数组的顺序,ideone link,但我仍然得到相同的输出。我认为这与 ideone 如何为变量分配内存有关。
输出:
pqrst
abcdepqrst
c - 在rodata中设置一个常数
我试图了解如何在rodata段中设置字符串的值,因为使用环境变量加载它会给我带来问题。我想在rodata部分外部设置一个常量字符串。这个函数应该独立于执行的代码。所以,当我这样做时
"objdump -c foo"
rodata 部分必须征用此字符串,而文件 foo.c 不必这样做。如何在 .rodata 部分中设置常量?
编辑:Linux 操作系统和使用 GCC
我不能使用环境变量,因为这意味着修改了 c 代码,我希望 c 代码保持不变并添加常量,例如“Goo”到rodata 段。
assembly - NASM compiling x86_64 ASM label addresses off by 256 bytes in Mach-O when using multiple db declarations?
In short, when I have multiple db
sections in my .data
section, the compiled addresses/labels are off when compiled by NASM. In my testing they are off by 256 bytes in the resulting Mach-O binary.
Software I am using:
- OS X 10.10.5
nasm
NASM version 2.11.08, installed via Homebrew as required for x84_64 ASMgobjdump
GNU objdump (GNU Binutils) 2.25.1, installed via Homebrewclang
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
What works:
Take for example the following "hello world" NASM assembly.
main.s
Compiled and run with:
This works great, and produces the following output:
What doesn't:
Now, to add another message, we just need to add another string to the data section, and another syscall
. Simple enough.
main.s
Compile and run, same as before, and we get:
What?!? Shouldn't we be getting?:
What's wrong?:
Something clearly went wrong. Time to disassemble the resulting binary and see what we got.
Produces the following for _main
:
From the comment # 100001100 <msgb+0xf2>
, we can see that it is pointing not to the msga
symbol, but to 0xf2
past msgb
, or 100001100
(at this address there are null bytes, resulting in no output). Inspecting the binary in a hex editor, I find the actual msga
string at offset 1000
, or address 100001000
. The means that the address in the compiled binary is now off by 0x100
/256
bytes, simply because there is now a second db
label. What?!?
A sorry excuse for a workaround:
As an experiment, I decided to try putting both of the db
sections into separate ASM/object files, and linking all 3 together. Doing so works.
main.s
msga.s
msgb.s
Compile and run with:
Results in:
While this does work, I find it hard to believe this is the best solution.
What is going wrong?
Surely there must be a way to have multiple db
labels in one ASM file? Am I doing something wrong in the way I write the ASM? Is this a bug in NASM? Is this expected behavior somehow, in which case why? My workaround is extra work and clutter, so I would greatly appreciate any assistance in this.
c - QEMU 对从 DATA 部分执行命令有限制吗?
我正在使用 QEMU 来模拟 ARM11 CPU。
我的程序太复杂,无法在这里解释,所以我将把这个问题投影到一个更简单的程序中。所以我的程序包含2个c文件:
- 主程序
- some_code.c
我正在编译 some_code.c(到 some_code.o),然后我将它转换为一个 HEX 数组变量,它代表 some_code.c 的代码。
现在我正在链接两个目标文件(main.o 和 some_code.o)。该变量(HEX 数组变量)位于 DATA 段。
现在我从 main.c 中的代码调用 HEX 数组变量(我的意图是此时 some_code.c 的代码将开始执行)。当程序计数器 (PC) 到达 HEX 数组变量时,它会出现异常(我没有关于异常的更多详细信息)。
如果我将这个 HEX 数组变量从 DATA 部分复制到 CODE 部分,现在当 PC 到达这一行时,它可以毫无例外地成功执行它。
所以我的问题是:
- QEMU 对从 DATA 部分执行命令有限制吗?
- 如果是这样,我该如何禁用此限制?
先谢谢了,
暗里
c++ - 什么是 c/c++ 数据段和堆栈大小?
我读到它取决于编译器和操作系统架构。如何在使用 GCC 作为编译器的 Linux 系统上找出数据段和堆栈最大大小?
c - 我可以在没有 malloc 的情况下释放指针地址吗?
让我们假设这段代码:
我想问一下:
- 内存是
block
在栈中还是在堆中分配的? - 这段代码可能会出现什么问题?
- 我可以
free(block)
在这段代码的末尾使用吗?
stack - 堆栈上的可执行 Ada 代码
我刚刚观看了去年32C3关于铁路系统安全注意事项的演讲。在第 25 分钟,演讲者简短地谈到了艾达。具体来说,他说:
典型的 Ada 实现有一种称为“(tramp / trunk / ?)lines”的机制。这意味着它将在 [the] 堆栈上执行代码,这对 C 程序来说不是很好。[...] 如果您想将 Ada 代码与 C 库链接,其中一种安全机制将不起作用。
这是演讲的各个部分的链接(YouTube)。这是背景中的幻灯片。如您所见,我不确定其中一个词。也许是蹦床?
现在我直截了当地问:这句话有道理吗?如果是这样,任何人都可以详细说明 Ada 语言的这个神秘特性及其明显影响的安全机制吗?
到目前为止,我一直认为代码位于代码段(也称为“文本”)中,而数据(包括堆栈)则位于不同内存位置的数据段中(如图所示)。在 Ada 中阅读有关内存管理的内容表明它应该不会有太大的不同。
虽然有一些方法可以规避这样的布局(参见例如这个“ C on stack ”问题和这个“ C on heap ”答案),但我相信现代操作系统通常会通过可执行空间保护来阻止这种尝试,除非堆栈被明确设为可执行。- 但是,对于嵌入式系统,如果代码没有保存在 ROM 上,它可能仍然是一个问题(有人可以澄清吗?)。