标签: data-segment

C中的bss段

关于 " 关于Unix中的bss段和数据段 "的问题的答案之一中,我看到对bss的解释如下:

Bss是特殊的:.bss对象不占用目标文件中的任何空间,并且通过将未特别初始化的所有符号分组在一起,可以很容易地将它们一次归零.

但是当我在目标文件上使用size时,会生成代码:

#include <stdio.h>
int uninit_global_var;
int init_global_var=5;

int main()
{
   int local_var;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有以下内容

text    data      bss    dec     hex filename
1231     280      12    1523     5f3 a.out
Run Code Online (Sandbox Code Playgroud)

并根据具有全局范围的未初始化数据成员查看bss的增长情况.那么有人可以证明上述陈述的合理性吗?

c memory-management data-segment

8
推荐指数
2
解决办法
3930
查看次数

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

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

c++ linux stack gcc data-segment

6
推荐指数
2
解决办法
3986
查看次数

为什么linux在异常处理程序的序言中将数据段设置为__USER_DS

我正在尝试阅读Linux源代码(2.6.11)

在异常处理程序中,在entry.s,error_code:

movl $(__USER_DS), %ecx
movl %ecx, %ds
movl %ecx, %es
Run Code Online (Sandbox Code Playgroud)

我不知道为什么在这里加载用户数据段.由于它应该进入在内核模式下运行的异常处理程序代码,因此选择器应该是__KERNEL_DS.

我检查了其他版本的代码,他们在这个地方也做了同样的事情.

linux data-segment exceptionhandler

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

在 Linux 中的程序集 x86_64 中获取声明处的字符串长度

string1请参阅和的陈述string2以及他们的len1len2。该代码是使用GNU Assembler的 x86_64 汇编,传递参数来调用Linux x86_64 系统调用。当我执行时,它奇怪地生成一个无意义的值()。然而,当我它工作正常。前者作为 的参数,后者作为 的参数。mov len1, %rdx8390045993705406470mov len1, %rdimovsys_writesys_exit

代码: (foo.s

.section .data
    string1: .string "test\n"
    len1: .long .-string1

    string2: .string "another\n"
    len2: .long .-string2
.section .text
    .globl _start

_start:
# Linux syscall references
# http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

    # write syscall
    mov $1, %rax # sys_write
    mov $1, %rdi # unsigned int fd: stdout
    lea string1, %rsi # const …
Run Code Online (Sandbox Code Playgroud)

linux string assembly x86-64 data-segment

5
推荐指数
0
解决办法
1876
查看次数

是否有Perl的__DATA__段的C++等价物(或等效技术)?

是否有人知道Perl的C++等效__DATA__片段?对于不熟悉Perl的人,该__DATA__段是一个(可选)注释,指向Perl文件的末尾; 任何后来被认为是(虚拟)文件的内容,Perl可以通过DATA文件句柄访问(读取,写入).我正在寻找类似于在C++程序中使用的东西(不要问,不要告诉).

谢谢

c++ perl data-segment

4
推荐指数
1
解决办法
199
查看次数

使用多个db声明时,NASM编译x86_64 ASM标签在Mach-O中关闭256个字节?

简而言之,当我db在我的.data部分中有多个部分时,编译的地址/标签在NASM编译时关闭.在我的测试中,它们在得到的Mach-O二进制文件中关闭了256个字节.

我使用的软件:

  • OS X 10.10.5
  • nasm NASM版本2.11.08,根据x84_64 ASM的要求通过Homebrew安装
  • gobjdump GNU objdump(GNU Binutils)2.25.1,通过Homebrew安装
  • clang Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn)

什么有效:

以下面的"hello world"NASM程序集为例.

main.s

global _main

section .text
_main:
mov     rax, 0x2000004
mov     rdi, 1
lea     rsi, [rel msg]
mov     rdx, len
syscall

mov     rax, 0x2000001
mov     rdi, 0
syscall

section .data
msg:    db      "Hello, world!", 10
len:    equ     $ - msg
Run Code Online (Sandbox Code Playgroud)

编译并运行:

/usr/local/bin/nasm -f macho64 -o main.o main.s
clang -o main main.o
./main
Run Code Online (Sandbox Code Playgroud)

这很好用,并产生以下输出:

Hello, world!
Run Code Online (Sandbox Code Playgroud)

什么不:

现在,要添加另一条消息,我们只需要在数据部分添加另一个字符串,另一个syscall …

assembly x86-64 mach-o nasm data-segment

4
推荐指数
1
解决办法
405
查看次数

堆栈上的可执行Ada代码

我刚刚从去年的32C3开始就铁路系统的安全考虑进行了讨论.在第25分钟,演讲者简要介绍了阿达.他具体说:

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

以下是对话题各部分的链接(YouTube).是背景中的幻灯片.如你所见,我不确定其中一个词.也许是蹦床


现在我的直言不讳的问题:这句话中有没有真相?如果是这样,任何人都可以详细说明Ada语言的神秘特征及其明显影响的安全机制吗?

直到现在我总是假设代码生活在一个代码段(也称为"文本"),而数据(包括堆栈)被放置在一个数据段在不同的存储位置(如所描绘这个图形).在Ada中阅读关于内存管理的建议表明它应该没有太大的不同.

虽然有办法绕过这样的布局(参见例如" C on stack "问题和这个" C on heap "答案),但我相信现代操作系统通常会通过可执行空间保护来阻止此类尝试,除非显式地使堆栈可执行. - 但是,对于嵌入式系统,如果代码没有保存在ROM上,那么它可能仍然是一个问题(任何人都可以澄清吗?).

stack ada scada safety-critical data-segment

4
推荐指数
1
解决办法
1113
查看次数

静态存储(主要是数据段)会导致分段错误吗?

static存储在编译时决定.但是,请考虑我们在函数中进行大量延迟初始化的情况:

void foo ()
{
  static int a[1000];
}
Run Code Online (Sandbox Code Playgroud)

我不是在讨论这里的编码实践,而是讨论技术方面.由于执行了许多其他类似 foo()功能,static因此将在数据段上引入这些许多变量.

为数据段分配空间时,编译器是否也会在帐户中进行延迟初始化.如果'否'那么,它会在代码执行时在运行时导致分段错误吗?(当方法static内部有大量数据时更有可能发生template).

x86 segmentation-fault lazy-initialization data-segment

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

数据段与堆栈

全局变量分配在数据段中,而局部变量留在堆栈中。我知道访问存储在堆中的变量比访问局部变量慢,但我不知道访问局部变量是否比访问全局变量快。它取决于编译器吗?差异是否显着?

c stack data-segment

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

没有malloc可以释放指针地址吗?

我们假设这段代码:

int i,j=0;
char* block = (char*) (0x9000);
char table[4]= {0x01,0x02,0x03,0x04};
for (i=0; i< 45567; i++) {
    *(block +i)= table[j]; 
    j++; 
    if (j==4)
        j=0;
}
Run Code Online (Sandbox Code Playgroud)

我想问一下:

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

c linux data-segment

-7
推荐指数
1
解决办法
1548
查看次数