小编Bul*_* M.的帖子

ELF中SHT_NULL节的用途是什么?

  1. SHT_NULL节的目的是什么ELF
  2. 它是由OS还是加载器引用的?
  3. 这部分的大小是多少?
  4. 它和NULL指针有关系吗?
  5. 另外,为什么本节在节段映射中没有条目?

根据ELF规范:

SHT_NULL:此值将节标题标记为无效;它没有关联的部分。节标题的其他成员具有未定义的值。

elf

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

如何从汇编中调用C编写的代码?

已解决的问题 应使主符号全局化,以便链接器在链接时可以在目标文件中找到它.更正了代码.

在执行任务时,尝试从程序集中调用简单的C函数(YASM汇编程序):

写了C函数:

#include <stdio.h>

void
func_in_c(char *s)
{
        printf("%s", s);
}
Run Code Online (Sandbox Code Playgroud)

写了调用汇编代码:

        segment .data
str_t_c db "Wow", 0

        segment .text
        global  main ; That is the solution - let linker find global symbol
        extern printf
        extern func_in_c
main:
        push rbp
        mov rbp, rsp
        lea rdi, [str_to_c]
        call func_in_c
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

汇编汇编:

yasm -f elf64 -m amd64 -g dwarf2 main.asm
Run Code Online (Sandbox Code Playgroud)

编译c代码:

gcc -o main_c.o -c main_c.c
Run Code Online (Sandbox Code Playgroud)

试图将两个目标文件链接到单个可执行二进制文件:

gcc -o main main_c.o main.o
Run Code Online (Sandbox Code Playgroud)

拿到:

...
In function _start:
(.text+0x20): undefined …
Run Code Online (Sandbox Code Playgroud)

c x86-64 yasm

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

为什么这两个值都没有丢弃?

ghci中有以下内容:

:m + Control.Monad.Error
let f x = Right x

Left 1.0 >> Right 1 >>= f
Run Code Online (Sandbox Code Playgroud)

Left 1.0
Run Code Online (Sandbox Code Playgroud)

据我了解>>运算符丢弃第一个参数的monadic结果,但我看到它在这里被保留.你能解释一下吗?

http://hackage.haskell.org/package/base-4.10.0.0/docs/src/Data.Either.html#Either

奇怪的是,该链接并未显示Either如何实现Monad类型类的方法.

monads haskell

3
推荐指数
1
解决办法
120
查看次数

如何获得字符串'aa',ab'到'yz','zz'?

如何从列表中的'aa'到'zz'获取字符串?我知道这很明显,但不知道解决这类问题的正确习惯.只要用具体的例子说明这个想法,我就会弄清楚其余的.谢谢.

试着

(++) <$> ['a'..'z'] <*> ['a'..'z']
Run Code Online (Sandbox Code Playgroud)

但它没有编译.

haskell haskell-stack

3
推荐指数
1
解决办法
100
查看次数

为什么组装的可执行文件大小相同

在x86_64架构中,可以将一些指令操作数组合更改为较短的组合以实现相同的效果,但可执行文件较小.例如,通常写:

xor eax, eax
Run Code Online (Sandbox Code Playgroud)

代替:

xor rax, rax
Run Code Online (Sandbox Code Playgroud)

我想测试它,在汇编中编写简单的程序:

    segment .text
    global main
main:
    push rbp
    mov rbp, rsp
    xor rax, rax ; line in question
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

内置:

yasm -f elf64 -m amd64 -g dwarf2 main.asm; clang -o main main.o
Run Code Online (Sandbox Code Playgroud)

检查尺寸:

stat main
Run Code Online (Sandbox Code Playgroud)

拿到:

....
Size: 9184
...
Run Code Online (Sandbox Code Playgroud)

好的,将问题更改为:

xor eax, eax
Run Code Online (Sandbox Code Playgroud)

希望获得更小的可执行文件,但获得相同的9184字节大小.使用较短的指令表格为什么尺寸没有减少?

assembly x86-64 intel instructions

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

为什么不能在多个函数中定义相同的本地标签?

要在多个函数中定义相同的本地标签:

    .text
    .globl main
func:
    push %rbp
    mov %rsp, %rbp
.a:
    leave
    ret

main:
    push %rbp
    mov %rsp, %rbp
.a:
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

奇怪地得到错误:

$ clang -c main.s
main.s:13:1: error: invalid symbol redefinition
.a:
^
Run Code Online (Sandbox Code Playgroud)

当我使用yasm时,它允许多个功能使用相同的本地标签。你有什么线索吗?

syntax assembly x86-64 gnu-assembler

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

两个函数如何同时使用一个参数

我正在阅读有关应用仿函数的文章,并找到了这样一句话:

(+) <$> (+3) <*> (*100) $ 5
Run Code Online (Sandbox Code Playgroud)

它输出508.

(+3)和(*100)如何同时使用5?为什么我们不需要传递两个5作为参数,如:

(+) <$> (+3) <*> (*100) $ 5 5
Run Code Online (Sandbox Code Playgroud)

haskell

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

为什么列出monad按顺序组合?

我正在阅读列表monad并遇到:

[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)  
Run Code Online (Sandbox Code Playgroud)

它产生

[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

这是我理解的方式:

隐含括号是:

([1,2] >>= \n -> ['a','b']) >>= (\ch -> return (n,ch))
Run Code Online (Sandbox Code Playgroud)

([1,2] >>= \n -> ['a','b']) 应该给 [('a',1),('b',1),('a',2),('b',2)]

因为

instance Monad [] where  
  return x = [x]  
  xs >>= f = concat (map f xs)   -- this line
  fail _ = []
Run Code Online (Sandbox Code Playgroud)

所以concat (map f xs)concat (map (\n -> ['a','b']) [1,2])应当产生[('a',1),('b',1),('a',2),('b',2)]-实际输出的正好相反.

然后我不明白>>= (\ch -> return (n,ch))部分 - 我认为 …

syntax monads haskell list parentheses

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

共享库如何找到GOT部分?

当我在阅读http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/#id1时, 问题来了:

在进程的虚拟地址空间中加载后,PIC共享库如何知道如何引用外部变量?

这是有问题的共享库的代码:

#include <stdio.h>

extern long var;

void
shara_func(void)
{
        printf("%ld\n", var);
}
Run Code Online (Sandbox Code Playgroud)

生成对象代码,然后生成共享对象(库):

gcc -fPIC -c lib1.c                    # produce PIC lib1.o
gcc -fPIC -shared lib1.o -o liblib1.so # produce PIC shared library
Run Code Online (Sandbox Code Playgroud)

shara_func在共享库中反汇编:

objdump -d liblib1.so
 ...
 00000000000006d0 <shara_func>:
 6d0:   55                      push   %rbp
 6d1:   48 89 e5                mov    %rsp,%rbp
 6d4:   48 8b 05 fd 08 20 00    mov    0x2008fd(%rip),%rax        # 200fd8 <_DYNAMIC+0x1c8>
 6db:   48 8b 00                mov    (%rax),%rax
 6de:   48 89 c6                mov    %rax,%rsi
 6e1: …
Run Code Online (Sandbox Code Playgroud)

linux shared-libraries relocation extern position-independent-code

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

`pure x =(\ _ - > x)`是什么意思?

我正在读函数的Applicative实例,并遇到了一行

instance Applicative ((->) r) where  
  pure x = (\_ -> x)  
  f <*> g = \x -> f x (g x)
Run Code Online (Sandbox Code Playgroud)

我理解语法,但不理解第二行的含义.

我的理解是:部分应用函数((->) r)获取一个值并将该值包装到上下文中,该上下文包含始终返回该值的函数.

为什么不通过将部分应用的函数应用于此来计算结果x,并且仅在此之后它将结果存储在Applicative上下文中?

haskell types typeclass semantics

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

int [9]和[3] [3]之间的差异

有什么区别

#include <stdio.h>

int a[9]; 

int
main()
{
    printf("%d\n", a[1]);
}
Run Code Online (Sandbox Code Playgroud)

#include <stdio.h>

int a[3][3]; 

int
main()
{
  printf("%d\n", a[1]);
}
Run Code Online (Sandbox Code Playgroud)

我认为两者都会在.bss段中放置相同的36字节内存缓冲区,有什么区别?或者a[3][3]语法糖结束了a[9] - a[3*3]吗?

c arrays multidimensional-array

0
推荐指数
1
解决办法
175
查看次数

m >> = return是什么意思?

正在阅读有关monad的教程并坚持以下内容:

let m = return 2 :: IO Int
Run Code Online (Sandbox Code Playgroud)

这是可以理解的 - 我们在monadic变量(IO 2)中打包2但是以下是什么意思?

m >>= return
Run Code Online (Sandbox Code Playgroud)

它输出2.

正如我从Monad定义中所知,返回总是只接受一个参数.但是,这里的争论不存在.如何理解?

monads haskell

0
推荐指数
1
解决办法
72
查看次数