代码之家  ›  专栏  ›  技术社区  ›  Some Name

jni函数调用一些gdb不知道的libc函数

  •  0
  • Some Name  · 技术社区  · 5 年前

    我有一个简单的jni函数,用于将数据从文件读取到 byte[] 从C代码 UnixUtil.unsafeReadToByteArray 具体实施如下:

    JNIEXPORT jlong JNICALL Java_net_xxxxxxx_UnixUtil_unsafeReadToByteArray
      (JNIEnv *e, jclass jc, jint fd, jbyteArray array, jlong offset, jlong count){
      signed char *array_native_ptr = (*e) -> GetByteArrayElements(e, array, NULL);
      ssize_t bytes_read = read(fd, array_native_ptr + offset, (size_t) count);
      (*e) -> ReleaseByteArrayElements(e, array, array_native_ptr, 0);
      return bytes_read;
    }
    

    分析运行该函数的Java应用程序显示出一些不明确的结果。上面是:

    enter image description here

    最热门的一件事是按地址进行指令 0x18eb1f 它来自 libc-2.27.so . 我想知道是什么,但gdb不知道

    (gdb) disas 0x18eb1f
    No function contains specified address
    

    用libc替换我找到的地址

    18eb0b:       72 0f                   jb     18eb1c <__nss_group_lookup@GLIBC_2.2.5+0x24ddc>
    [...]
    18eb1c:       48 89 d1                mov    %rdx,%rcx
    18eb1f:       f3 a4                   rep movsb %ds:(%rsi),%es:(%rdi)
    

    看起来它是 __nss_group_lookup 虽然 _ nss_组查找 似乎不包含地址:

    (gdb) disas __nss_group_lookup
    Dump of assembler code for function __nss_passwd_lookup:
       0x0000000000169d40 <+0>:     mov    rax,QWORD PTR [rip+0x281121]        # 0x3eae68
       0x0000000000169d47 <+7>:     mov    DWORD PTR fs:[rax],0x26
       0x0000000000169d4e <+14>:    mov    eax,0xffffffff
       0x0000000000169d53 <+19>:    ret    
    End of assembler dump. making the things more unclear then it was before.
    

    使事情比以前更不清楚。

    问题: 你能告诉我为什么这个指令属于 _ nss_组查找 是最热门的 jni_GetByteArrayElements / jni_ReleaseByteArrayElements 以及它到底是什么。

    我的期望是 JNI_Getbytearrayellements公司 / 按顺序释放 复制 字节[] 从Java堆到C堆 memcpy 会是最热的。

    0 回复  |  直到 5 年前
        1
  •  2
  •   apangin    5 年前

    显然系统上的libc不包含调试符号(没有 .symtab 共享库中的部分)。因此,gdb显示最近的导出符号 .dynsym ,与实际最热的功能无关。

    rep movsb 指令表明此片段是 memcpy 实施。

    安装 libc-dbg 包(或者在Linux发行版中如何调用它)。

    例如,在我的ubuntu 18.04上 __nss_group_lookup+0x24ddc 确实是指 曼皮西 内构件:

    (gdb) disas __nss_group_lookup+0x24ddc
    Dump of assembler code for function __memmove_avx_unaligned_erms:
       0x00007ffffef7ead0 <+0>:     mov    %rdi,%rax
       ...
       0x00007ffffef7eb1c <+76>:    mov    %rdx,%rcx
       0x00007ffffef7eb1f <+79>:    rep movsb %ds:(%rsi),%es:(%rdi)
       0x00007ffffef7eb21 <+81>:    retq