在关于 " 关于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的增长情况.那么有人可以证明上述陈述的合理性吗?
我读到它取决于编译器和操作系统架构。如何在使用 GCC 作为编译器的 Linux 系统上找出数据段和堆栈最大大小?
我正在尝试阅读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.
我检查了其他版本的代码,他们在这个地方也做了同样的事情.
string1
请参阅和的陈述string2
以及他们的len1
和len2
。该代码是使用GNU Assembler的 x86_64 汇编,传递参数来调用Linux x86_64 系统调用。当我执行时,它奇怪地生成一个无意义的值()。然而,当我它工作正常。前者作为 的参数,后者作为 的参数。mov len1, %rdx
8390045993705406470
mov len1, %rdi
mov
sys_write
sys_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) 是否有人知道Perl的C++等效__DATA__
片段?对于不熟悉Perl的人,该__DATA__
段是一个(可选)注释,指向Perl文件的末尾; 任何后来被认为是(虚拟)文件的内容,Perl可以通过DATA文件句柄访问(读取,写入).我正在寻找类似于在C++程序中使用的东西(不要问,不要告诉).
谢谢
简而言之,当我db
在我的.data
部分中有多个部分时,编译的地址/标签在NASM编译时关闭.在我的测试中,它们在得到的Mach-O二进制文件中关闭了256个字节.
我使用的软件:
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 …
我刚刚从去年的32C3开始就铁路系统的安全考虑进行了讨论.在第25分钟,演讲者简要介绍了阿达.他具体说:
典型的Ada实现具有称为"(tramp/trunk /?)行"的机制.这意味着它将在[堆栈]上执行代码,这对C程序来说并不是很好.[...]如果您想将Ada代码与C库链接,其中一种安全机制将无法正常工作.
以下是对话题各部分的链接(YouTube).这是背景中的幻灯片.如你所见,我不确定其中一个词.也许是蹦床?
现在我的直言不讳的问题:这句话中有没有真相?如果是这样,任何人都可以详细说明Ada语言的神秘特征及其明显影响的安全机制吗?
直到现在我总是假设代码生活在一个代码段(也称为"文本"),而数据(包括堆栈)被放置在一个数据段在不同的存储位置(如所描绘这个图形).在Ada中阅读关于内存管理的建议表明它应该没有太大的不同.
虽然有办法绕过这样的布局(参见例如" C on stack "问题和这个" C on heap "答案),但我相信现代操作系统通常会通过可执行空间保护来阻止此类尝试,除非显式地使堆栈可执行. - 但是,对于嵌入式系统,如果代码没有保存在ROM上,那么它可能仍然是一个问题(任何人都可以澄清吗?).
static
存储在编译时决定.但是,请考虑我们在函数中进行大量延迟初始化的情况:
void foo ()
{
static int a[1000];
}
Run Code Online (Sandbox Code Playgroud)
我不是在讨论这里的编码实践,而是讨论技术方面.由于执行了许多其他类似 foo()
的功能,static
因此将在数据段上引入这些许多变量.
在为数据段分配空间时,编译器是否也会在帐户中进行延迟初始化.如果'否'那么,它会在代码执行时在运行时导致分段错误吗?(当方法static
内部有大量数据时更有可能发生template
).
全局变量分配在数据段中,而局部变量留在堆栈中。我知道访问存储在堆中的变量比访问局部变量慢,但我不知道访问局部变量是否比访问全局变量快。它取决于编译器吗?差异是否显着?
我们假设这段代码:
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)
我想问一下:
block
在堆栈中还是在堆中分配的内存?free(block)
在此代码的末尾使用吗?