我正在尝试使用sys_open系统调用,我获取文件描述符以供阅读.这是我的计划:
SYS_exit equ 0x3C
SYS_open equ 0x02
O_RDONLY equ 0x00
O_WRONLY equ 0x01
O_RDWR equ 0x02
section .text
global _start
_start:
mov eax, SYS_open
mov rdi, file_name
mov rsi, O_RDONLY
mov rdx, 0x00
syscall
mov eax, SYS_exit
mov rdi, 0x00
syscall
section .data
file_name: db '/path/to/test\0'
Run Code Online (Sandbox Code Playgroud)
所以当我跑步时strace ./bin我得到了输出:
open("/path/to/test\\0", O_RDONLY) = -1 ENOENT (No such file or directory)
exit(0)
Run Code Online (Sandbox Code Playgroud)
删除null-terminal后似乎工作正常:
open("/path/to/test", O_RDONLY) = 3
exit(0) = ?
Run Code Online (Sandbox Code Playgroud)
我很好奇汇编程序如何知道我的字符串的长度.二进制文件中数据部分的内容如下:
Contents of section .data:
6000d8 2f706174 682f746f 2f746573 …Run Code Online (Sandbox Code Playgroud) 我试图理解堆栈分配对象的解除分配行为.确切地说,我试图在标准中找到解释(N1570).考虑以下简单功能:
void foo(){
char test[4096];
test[10] = 0;
}
Run Code Online (Sandbox Code Playgroud)
退出test时,数组将被释放foo.很容易看出,objdump它test是在堆栈上分配的.标准(强调我的)说明:
声明标识符没有链接且没有存储类说明符静态的对象具有自动存储持续时间,一些复合文字也是如此.
所以test有自动存储时间.我们可以轻松地重写函数如下:
void test(){
char *test= malloc(4096 * sizeof(char));
test[10] = 0;
free(test);
}
Run Code Online (Sandbox Code Playgroud)
但我们必须自己解除分配,但test仍然有自动存储时间.
问题:标准如何指定char test[4096]将在函数退出时释放?标准没有声明test在堆栈上分配,它是实现定义的.
我在Scala做了一些工作人员并遇到了implicit实例问题.让我们考虑以下示例:
import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._
class Test[F[_]: Monad] extends App{
val t1 = ().pure[F]
val t2 = ().pure[F]
def testFlatApplicative: F[Unit] =
for{
_ <- t1
_ <- t2
} yield ()
}
Run Code Online (Sandbox Code Playgroud)
编译好了.但由于cats.Monad[F[_]]声明如下:
@typeclass trait Monad[F[_]] extends FlatMap[F] with Applicative[F]
Run Code Online (Sandbox Code Playgroud)
我希望以下内容也能正常运行
import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._
class Test[F[_]: FlatMap : Applicative] extends App{
val t1 = ().pure[F]
val t2 = ().pure[F]
def testFlatApplicative: F[Unit] …Run Code Online (Sandbox Code Playgroud) 我正在尝试CPackmodule ofCMake并得到一些令人困惑的行为。我已将CpackMylib.cmake其包含在 root 中CMakeLists.txt。它看起来如下:
include(CPack) #included on top
install (TARGETS mylib
LIBRARY
DESTINATION /usr/lib
COMPONENT mylib-all
)
install (DIRECTORY include/
DESTINATION /usr/include/mylib
COMPONENT mylib-all)
set(CPACK_PACKAGE_NAME "mylib")
set(CPACK_GENERATOR "DEB")
Run Code Online (Sandbox Code Playgroud)
并且在运行时make package无法创建具有以下跟踪的包:
Run CPack packaging tool...
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: mylib
CPack: - Install project: mylib
CMake Error at /home/krjoff/mylib/cmake_install.cmake:55 (file):
file INSTALL cannot copy file "/home/krjoff/mylib/libmylib.so" to
"/usr/lib/mylib.so".
CMake Error at …Run Code Online (Sandbox Code Playgroud) I'm trying to understand how stack works in Linux. I read AMD64 ABI sections about stack and process initialization and it is not clear how the stack should be mapped. Here is the relevant quote (3.4.1):
Stack State
This section describes the machine state that
exec(BA_OS) creates for new processes.
and
It is unspecified whether the data and stack segments are initially mapped with execute permissions or not. Applications which need to execute code on the stack or data …
英特尔指令参考中提供了以下文档以供参考COMISD:
在操作数1(第一个操作数)的低四字比较双精度浮点值和操作数2(第二个操作数),并设定了
ZF,PF和CF在EFLAGS标志寄存器根据结果(无序,大于,小于大于或等于)。
的CF的标志点是不是真的在这里清除,因为它关系到算术运算的无符号整数。相反,文档关注的是按定义签名的浮点。我进行了一些实验,例如
mov rax, 0x123
movq xmm0, rax
mov rax, 0x124
movq xmm1, rax
ucomisd xmm0, xmm1 ;CF is set here like if
;we would compare uints 0x123 and 0x124
Run Code Online (Sandbox Code Playgroud)
因此,当将操作数设置为双精度浮点时,该指令会将操作数设置为进位标志时,会将操作数视为无符号整数?
在我看来,这有点奇怪。
raxSystemV ABI:和中仅定义了 2 个返回寄存器rdx,但structs 的大小可以远大于 16 字节,并且可以具有 2 个以上的成员。所以我考虑了下面的例子:
struct test{
unsigned long a;
char *b;
unsigned long c;
};
struct test get_struct(void){
return (struct test){.a = 10, .b = "abc", .c = 20};
}
void get_struct2(struct test *tst){
struct test tmp = {.a = 10, .b = "abc", .c = 20};
*tst = tmp;
}
Run Code Online (Sandbox Code Playgroud)
这些函数的O3编译代码看起来几乎相同:gcc
Dump of assembler code for function get_struct:
0x0000000000000820 <+0>: lea rdx,[rip+0x2f6] # 0xb1d
0x0000000000000827 <+7>: …Run Code Online (Sandbox Code Playgroud) Whiskey Lake i7-8565U
RESOURCE_STALLS.OTHER英特尔文档看起来并没有很好地解释:
\n\n\n计算由于其他资源问题而导致执行停滞的周期数。\n
\n
16MiB我对一个由迭代组成的循环中随机生成的数据的内存副本示例进行了实验6400。
基线:
\n\navx_memcpy_baseline:\n shr rdx, 0x3\n xor rcx, rcx\navx_memcpy_baseline_loop:\n add rcx, 0x08\n cmp rdx, rcx\n ja avx_memcpy_baseline_loop\n ret\nRun Code Online (Sandbox Code Playgroud)\n\n基线计数器:
\n\n 823\xe2\x80\xaf292\xe2\x80\xaf269 resource_stalls.any\n 181\xe2\x80\xaf045 r02a2 #LOAD\n 831\xe2\x80\xaf370\xe2\x80\xaf403 r04a2 #RS_FULL\n 49\xe2\x80\xaf659 resource_stalls.sb\n 130\xe2\x80\xaf100 r10a2 #ROB_FULL\n 63\xe2\x80\xaf386 r20a2 #FPCW\n 2\xe2\x80\xaf151\xe2\x80\xaf516 r40a2 #MSCXR\n 4\xe2\x80\xaf222 r80a2 #OTHER \nRun Code Online (Sandbox Code Playgroud)\n\n世界银行商店:
\n\navx_memcpy_forward_llss:\n shr rdx, 0x3\n xor rcx, rcx\navx_memcpy_forward_loop_llss:\n vmovdqa ymm0, [rsi + 8*rcx]\n vmovdqa ymm1, [rsi + …Run Code Online (Sandbox Code Playgroud) 让我so用g ++ 编译一个共享库,如下所示
g++ -shared -Wl,-soname,libtest.1.0 -o libtest.1.0.1 test.o
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将二进制文件与此lib链接时,请编写以下内容:
g++ -o bin -L. -ltest -Wl,-rpath.
Run Code Online (Sandbox Code Playgroud)
链接器尝试搜索libtest.so没有任何版本号.
如何将-l具有版本号的lib名称传递给链接器选项?
以下是我的HibernateUtil类:
package Hibernate.util;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器:
package Controllers;
import DAOImpl.ProductDAOImpl;
import Entities.Product;
import java.sql.SQLException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ProductController …Run Code Online (Sandbox Code Playgroud)