小编Mik*_*wan的帖子

gnuplot绘制多个折线图

我有以下dat文件,名为ls.dat:

# Gnuplot script file for "ls"
# Version       Removed Added   Modified
8.1     0       0       0
8.4     0       0       4
8.5     2       5       9
8.6     2       7       51
8.7     2       7       51
8.8     2       7       51
8.9     2       7       51
8.10    2       7       51
8.11    2       8       112
8.12    2       8       112
8.13    2       17      175
8.17    6       33      213
Run Code Online (Sandbox Code Playgroud)

我试图用这个绘图:

plot "ls.dat" using 1:2 title 'Removed' with lines,\
     "ls.dat" using 1:3 title 'Added' with lines,\
     "ls.dat" using …
Run Code Online (Sandbox Code Playgroud)

gnuplot

20
推荐指数
3
解决办法
11万
查看次数

如何从libopcodes获取指令信息?

我写它使用的工具libbfd,并libopcodes在X86-32和x86-64 Linux来进行拆卸.问题是,虽然我能够获得libopcodes进行反汇编,但我无法获得任何指令信息.出于演示的目的,我做了一个最小的例子来重现我的问题.该程序应该从入口点拆分到第一个RET/ RETQ.

代码有点被全局修改,为简洁起见省略了错误检查等,但应该清楚地说明问题.

#include <bfd.h>
#include <dis-asm.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>
#include <limits.h>
#include <libiberty.h>

/*
 * Holds state for BFD and libopcodes.
 */
bfd *        abfd  = NULL;
disassemble_info dinfo = {0};

/*
 * Temporary hack to signal when disassembling should stop.
 */
static bool stop_disassembling = FALSE;

/*
 * Gets path to currently running executable.
 */
bool get_target_path(char * target_path, …
Run Code Online (Sandbox Code Playgroud)

c linux disassembly binutils

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

如何将目标文件"链接"到可执行/编译二进制文件?

问题

我希望将一个目标文件注入现有的二进制文件中.作为一个具体的例子,考虑一个来源Hello.c:

#include <stdlib.h>

int main(void)
{
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

它可以编译为名为Hellothrough 的可执行文件gcc -std=gnu99 -Wall Hello.c -o Hello.此外,现在考虑Embed.c:

func1(void)
{
}
Run Code Online (Sandbox Code Playgroud)

Embed.o可以从此创建目标文件gcc -c Embed.c.我的问题是如何将一般插入Embed.oHello以这样的方式使必要的位置进行,并适当ELF内部表(如符号表,PLT等)正确修补?


假设

可以假设要嵌入的目标文件已经静态链接其依赖关系.可以假设任何动态依赖项(例如C运行时)也存在于目标可执行文件中.


目前的尝试/想法

  • 使用libbfd从对象文件复制到节二进制.我对此所取得的进展是,我可以使用原始二进制文件中的部分和目标文件中的部分创建一个新对象.问题是,由于目标文件是可重定位的,因此无法在不先执行重定位的情况下将其部分正确复制到输出.
  • 将二进制文件转换回目标文件并重新链接ld.到目前为止,我尝试使用objcopy来执行转换objcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o.显然这不符合我的意图,因为那样ld -o Hello2 Embed.o Hello.o会导致ld: error: Hello.o: unsupported ELF file type 2.我想这应该是预期的,因为Hello它不是一个目标文件.
  • 找到执行此类插入的现有工具?

理由(可选阅读)

我正在制作一个静态可执行编辑器,其目的是允许将任意用户定义的例程检测到现有的二进制文件中.这将分两步进行:

  1. 将对象文件(包含用户定义的例程)注入二进制文件.这是一个必需的步骤,不能通过注入共享对象等替代方法来解决. …

c linux linker

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

在Linux上使用bfd.h编译错误

我是Linux编程的新手,我正在尝试使用BFD库.这是我正在尝试编译的当前代码:

#include <bfd.h>
#include <stdlib.h>

bfd *abfd;

int main() {
  bfd_init();
  abfd = bfd_openr("/home/mike/Desktop/testFunc/testProg", NULL);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用以下命令行进行编译:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

gcc readInfo.c /usr/lib/libbfd.a -o readInfo /usr/lib/libbfd.a(elflink.o):in function elf_link_add_object_symbols': /build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/../../bfd/elflink.c:4605: undefined reference toobjalloc_free_block'/build/buildd/binutils-2.21.53.20110810/builddir-single/bfd/ ../../bfd/elflink.c:4892:对_sch_istable' /usr/lib/libbfd.a(elflink.o): In functionbfd_elf_size_dynamic_sections'的未定义引用:/ build/buildd/binutils-2.21.53.20110810/builddir -single/bfd /../../bfd /elflink.c:6048 :对lbasename' undefined reference to_sch_istable的未定义引用'collect2:ld返回1退出状态make:* [all]错误1

还有很多错误,您可以在这里查看.我确信这有一个简单的解释,但它让我难过了一段时间.

总结到目前为止我所做的事情:

  • 安装了Ubuntu的干净版本
  • 安装了binutils-dev包

linux gcc

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

动态加载Linux共享库?

我想创建一个共享库,可以通过两种不同的方式加载到目标中:

  1. LD_PRELOAD
  2. 通过动态加载 dlsym

我的共享库看起来像这样:

#include "stdio.h"

void __attribute__ ((constructor)) my_load(void);

void my_load(void) {
  printf("asdf");
}

void someFunc(void) {
  printf("someFunc called");
}
Run Code Online (Sandbox Code Playgroud)

我正在编译它:

all:
    gcc -fPIC -g -c -Wall MyLib.c
    gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc
Run Code Online (Sandbox Code Playgroud)

我不希望用它ldconfig等安装它.目标进程如下所示:

#include <stdio.h>
#include <dlfcn.h>

void func1() {
  printf("%d\n", 1);
}

void func2() {
  printf("%d\n", 2);
}

void func3() {
  printf("%d\n", 3);
}

int main() {
  void* lib_handle = dlopen("/home/mike/Desktop/TargetProcess/MyLib.so.1.0.1",
                         RTLD_NOW|RTLD_GLOBAL);

  if(lib_handle == NULL) {
    printf("Failed loading lib\n");
  } else {
    printf("Loaded …
Run Code Online (Sandbox Code Playgroud)

linux shared

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

使用C预处理获取字符串的整数值

如何创建C宏来获取字符串的整数值?具体的用例来自这里的一个问题.我想改变这样的代码:

enum insn {
    sysenter = (uint64_t)'r' << 56 | (uint64_t)'e' << 48 |
               (uint64_t)'t' << 40 | (uint64_t)'n' << 32 |
               (uint64_t)'e' << 24 | (uint64_t)'s' << 16 |
               (uint64_t)'y' << 8  | (uint64_t)'s',
    mov = (uint64_t)'v' << 16 | (uint64_t)'o' << 8 |
          (uint64_t)'m'
};
Run Code Online (Sandbox Code Playgroud)

对此:

enum insn {
    sysenter = INSN_TO_ENUM("sysenter"),
    mov      = INSN_TO_ENUM("mov")
};
Run Code Online (Sandbox Code Playgroud)

在哪里INSN_TO_ENUM扩展到相同的代码.性能将是相同的,但可读性将大大提高.

我怀疑在这种形式下它可能是不可能的,因为C预处理器无法进行字符串处理,所以这也是一个不可取但可接受的解决方案(变量参数宏):

enum insn {
    sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
    mov      = INSN_TO_ENUM('m','o','v')
};
Run Code Online (Sandbox Code Playgroud)

c macros c-preprocessor

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

如何在Android WebView请求中查看请求标头?

如何拦截从Android发出的所有请求WebView并获取相应的请求标头?我希望看到WebView包含XHR,脚本源,CSS等的每个请求的标题.

iOS上的等价物是覆盖NSURLCache它将为您提供所有这些信息.以下可能是最接近我想要的,但据我所知,WebViewClient只有给我们回字符串:

void onLoadResource(WebView view, String url);
WebResourceResponse shouldInterceptRequest(WebView view, String url);
Run Code Online (Sandbox Code Playgroud)

android webview

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

如何将参数传递给Automake输入文件中的测试?

在我Makefile.am,我有以下测试:

TESTS += tests/test1
check_PROGRAMS += tests/test1
tests_test1_SOURCES = tests/test1.c
tests_test1_CPPFLAGS = ...
tests_test1_LDADD = ...
Run Code Online (Sandbox Code Playgroud)

test1make check被调用时编译并运行.应如何Makefile.am修改以将命令行参数传递给test1?

automake

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

使用gnuplot进行堆叠直方图

我正在尝试使用以下数据创建堆叠直方图:

8.01    1   5   1   
8.02    3   5   1
8.03    4   4   1
8.04    3   4   1
8.05    1   2   1
Run Code Online (Sandbox Code Playgroud)

我试图改编第四个例子中的脚本,现在我正在使用它:

set title "Test"
set key invert reverse Left outside
set key autotitle columnheader
set style data histogram
set style histogram rowstacked
set style fill solid border -1
set boxwidth 0.75

plot 'test.dat' using 2:xtic(1),  '' using 2 title 'Col1', '' using 3 title 'Col2', '' using 4 title 'Col3'
Run Code Online (Sandbox Code Playgroud)

我复制的部分我不确定using 2:xtic(1).我知道这使得它使用xtic值作为第一列,这就是我想要的.但我不知道这using 2部分代表什么.这是脚本生成的屏幕截图: …

gnuplot histogram

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

如何在GCC中指定枚举大小?

我想为枚举指定64位的枚举大小.这怎么可能通过海湾合作委员会?代码不需要是"可移植的",因为我只对将代码用于x86-32和x86-64 Linux的GCC编译感兴趣.这意味着任何可以提供我想要的功能的黑客都可以,只要它适用于那些目标.

鉴于此代码:

#include <stdlib.h>
#include <stdio.h>

enum some_enum
{
    garbage1,
    garbage2
};

int main(void)
{
    enum some_enum some_val;
    printf("size: %lu\n", sizeof(some_val));

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

这当前打印出4,而我希望能够强制大小为8.尝试在枚举赋值中指定大于4个字节的值会导致警告.例如,

enum some_enum
{
    garbage1 = '12345',
    garbage2
};
Run Code Online (Sandbox Code Playgroud)

会产生:

warning: character constant too long for its type [enabled by default]
Run Code Online (Sandbox Code Playgroud)

这里对类似问题的回答似乎没有产生任何好结果.也就是说,由于以下原因产生了相同的警告:

enum some_enum
{
    garbage1 = 'adfs',
    garbage2 = 'asdfasdf'
};
Run Code Online (Sandbox Code Playgroud)

注意:可以通过编译来关闭多字符警告-Wno-multichar.


合理

由于人们对我为什么这样做感兴趣,我编写了一个反汇编引擎.我将指令的每个部分都作为字符串.所以我希望枚举看起来像这样:

enum mnemonic
{
    mov = 'mov',
    cmp = 'cmp',
    sysenter = 'sysenter'
};
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用以下代码轻松存储语义信息:

enum mnemonic …
Run Code Online (Sandbox Code Playgroud)

c enums gcc

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