小编St.*_*rio的帖子

以空值终止的字符串,用于读取的打开文件

我正在尝试使用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)

linux assembly x86-64 nasm

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

了解堆栈分配的对象释放

我试图理解堆栈分配对象的解除分配行为.确切地说,我试图在标准中找到解释(N1570).考虑以下简单功能:

void foo(){
    char test[4096];
    test[10] = 0;
}
Run Code Online (Sandbox Code Playgroud)

退出test时,数组将被释放foo.很容易看出,objdumptest是在堆栈上分配的.标准(强调我的)说明:

声明标识符没有链接且没有存储类说明符静态的对象具有自动存储持续时间,一些复合文字也是如此.

所以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在堆栈上分配,它是实现定义的.

c arrays memory-management

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

Scala FlatMap和Applicative上下文边界会产生编译错误

我在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)

functional-programming scala scala-cats

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

为什么应该在每个项目包配置之后包含(CPack)?

我正在尝试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)

c++ cmake cpack

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

Analyzing memory mapping of a process with pmap. [stack]

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 …

c linux stack mmap linux-kernel

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

为什么x86 FP像无符号整数那样比较集CF,而不使用有符号条件?

英特尔指令参考中提供了以下文档以供参考COMISD

在操作数1(第一个操作数)的低四字比较双精度浮点值和操作数2(第二个操作数),并设定了ZFPFCF在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)

因此,当将操作数设置为双精度浮点时,该指令会将操作数设置为进位标志时,会将操作数视为无符号整数?

在我看来,这有点奇怪。

x86 assembly sse sse2 x87

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

返回 SystemV ABI 中的结构

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)

c assembly x86-64 abi calling-convention

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

resource_stall.other 可能意味着什么

Whiskey Lake i7-8565U

\n\n

RESOURCE_STALLS.OTHER英特尔文档看起来并没有很好地解释:

\n\n
\n

计算由于其他资源问题而导致执行停滞的周期数。\n

\n
\n\n

16MiB我对一个由迭代组成的循环中随机生成的数据的内存副本示例进行了实验6400

\n\n
\n\n

基线:

\n\n
avx_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\n
Run 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  \n
Run Code Online (Sandbox Code Playgroud)\n\n

世界银行商店:

\n\n
avx_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)

performance x86 assembly x86-64

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

如何使用版本名称将二进制文件与库链接

让我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名称传递给链接器选项?

c++ linux linker g++ shared-libraries

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

java.lang.NoClassDefFoundError:无法初始化类Hibernate.util.HibernateUtil

以下是我的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)

java hibernate spring-mvc

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