问题标签 [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.

0 投票
1 回答
863 浏览

c - 为什么全局变量存储在堆中?

为什么在下面的示例中,全局变量存储在堆段中,而不是 data/bss 段中?

从 maps 伪文件的以下输出来看,data/bss 段是第 3 行。这是因为它是读/写和匿名的。以下 2 个条目是堆(如标签所示)。

这是 /proc//maps 的输出:

但是,当我打印 2 个全局变量的位置时,我得到以下属于堆 vm 区域的地址:

我使用以下方法打印位置:

0 投票
2 回答
89 浏览

assembly - 用于读取 BIOS 数据段的 intel 到 ATT 汇编转换

以下英特尔代码的等效 ATT 代码是什么:

0 投票
1 回答
78 浏览

linux - 程序执行期间的数据段

怀疑:

如果我们执行一个程序,以下是分配给该程序的内存类型。

在这里,数据段起着至关重要的作用。所有已初始化的数据和未初始化的数据都存在于数据段中。但是,我不知道数据段中数据的存储顺序。例如,初始化数据、未初始化数据、只读数据和读写数据。我认为以上是数据段中存在的四种类型。

所以,数据将按什么顺序放置在数据段中。就像地址少于所有的第一个初始化数据一样。接下来是未初始化的数据,它们的地址比初始化的数据高。

提前致谢。

0 投票
3 回答
1367 浏览

c - 在C中打印字符数组

我知道我应该把'/o'放在字符数组的末尾但是当我想打印“printf(”%s\n“,kk);” ,它给出“abcdepqrst”。为什么会这样?这是我正在执行的程序。

输出:

pqrst

abcdepqrst

我尝试通过在此处的数组“kk”之前声明数组“s”来颠倒声明数组的顺序,ideone link,但我仍然得到相同的输出。我认为这与 ideone 如何为变量分配内存有关。

输出:

pqrst

abcdepqrst

0 投票
2 回答
1370 浏览

c - 在rodata中设置一个常数

我试图了解如何在rodata段中设置字符串的值,因为使用环境变量加载它会给我带来问题。我想在rodata部分外部设置一个常量字符串。这个函数应该独立于执行的代码。所以,当我这样做时

"objdump -c foo"

rodata 部分必须征用此字符串,而文件 foo.c 不必这样做。如何在 .rodata 部分中设置常量?

编辑:Linux 操作系统和使用 GCC

我不能使用环境变量,因为这意味着修改了 c 代码,我希望 c 代码保持不变并添加常量,例如“Goo”到rodata 段。

0 投票
2 回答
581 浏览

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 ASM
  • gobjdump GNU objdump (GNU Binutils) 2.25.1, installed via Homebrew
  • clang 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.

0 投票
2 回答
107 浏览

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 部分执行命令有限制吗?
  • 如果是这样,我该如何禁用此限制?

先谢谢了,

暗里

0 投票
3 回答
4247 浏览

c++ - 什么是 c/c++ 数据段和堆栈大小?

我读到它取决于编译器和操作系统架构。如何在使用 GCC 作为编译器的 Linux 系统上找出数据段和堆栈最大大小?

0 投票
6 回答
2623 浏览

c - 我可以在没有 malloc 的情况下释放指针地址吗?

让我们假设这段代码:

我想问一下:

  1. 内存是block在栈中还是在堆中分配的?
  2. 这段代码可能会出现什么问题?
  3. 我可以free(block)在这段代码的末尾使用吗?
0 投票
3 回答
1206 浏览

stack - 堆栈上的可执行 Ada 代码

我刚刚观看了去年32C3关于铁路系统安全注意事项的演讲。在第 25 分钟,演讲者简短地谈到了艾达。具体来说,他说:

典型的 Ada 实现有一种称为“(tramp / trunk / ?)lines”的机制。这意味着它将在 [the] 堆栈上执行代码,这对 C 程序来说不是很好。[...] 如果您想将 Ada 代码与 C 库链接,其中一种安全机制将不起作用。

这是演讲的各个部分的链接(YouTube)。是背景中的幻灯片。如您所见,我不确定其中一个词。也许是蹦床


现在我直截了当地:这句话有道理吗?如果是这样,任何人都可以详细说明 Ada 语言的这个神秘特性及其明显影响的安全机制吗?

到目前为止,我一直认为代码位于代码段(也称为“文本”)中,而数据(包括堆栈)则位于不同内存位置的数据段中(如图所示)。在 Ada 中阅读有关内存管理的内容表明它应该不会有太大的不同。

虽然有一些方法可以规避这样的布局(参见例如这个“ C on stack ”问题和这个“ C on heap ”答案),但我相信现代操作系统通常会通过可执行空间保护来阻止这种尝试,除非堆栈被明确设为可执行。- 但是,对于嵌入式系统,如果代码没有保存在 ROM 上,它可能仍然是一个问题(有人可以澄清吗?)。