SHT_NULL节的目的是什么ELF?根据ELF规范:
SHT_NULL:此值将节标题标记为无效;它没有关联的部分。节标题的其他成员具有未定义的值。
已解决的问题 应使主符号全局化,以便链接器在链接时可以在目标文件中找到它.更正了代码.
在执行任务时,尝试从程序集中调用简单的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) 在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类型类的方法.
如何从列表中的'aa'到'zz'获取字符串?我知道这很明显,但不知道解决这类问题的正确习惯.只要用具体的例子说明这个想法,我就会弄清楚其余的.谢谢.
试着
(++) <$> ['a'..'z'] <*> ['a'..'z']
Run Code Online (Sandbox Code Playgroud)
但它没有编译.
在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字节大小.使用较短的指令表格为什么尺寸没有减少?
要在多个函数中定义相同的本地标签:
.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时,它允许多个功能使用相同的本地标签。你有什么线索吗?
我正在阅读有关应用仿函数的文章,并找到了这样一句话:
(+) <$> (+3) <*> (*100) $ 5
Run Code Online (Sandbox Code Playgroud)
它输出508.
(+3)和(*100)如何同时使用5?为什么我们不需要传递两个5作为参数,如:
(+) <$> (+3) <*> (*100) $ 5 5
Run Code Online (Sandbox Code Playgroud) 我正在阅读列表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))部分 - 我认为 …
当我在阅读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
我正在读函数的Applicative实例,并遇到了一行
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
Run Code Online (Sandbox Code Playgroud)
我理解语法,但不理解第二行的含义.
我的理解是:部分应用函数((->) r)获取一个值并将该值包装到上下文中,该上下文包含始终返回该值的函数.
为什么不通过将部分应用的函数应用于此来计算结果x,并且仅在此之后它将结果存储在Applicative上下文中?
有什么区别
#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]吗?
正在阅读有关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定义中所知,返回总是只接受一个参数.但是,这里的争论不存在.如何理解?