小编rob*_*ert的帖子

在CMake中静态链接OpenSSL加密库

我想静态链接下面列出的库:

set_target_properties(exec PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(exec PROPERTIES LINK_SEARCH_END_STATIC 1)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})

find_library(SODIUM_LIB libsodium.a REQUIRED)
find_library(SSL_LIB libssl.a REQUIRED)
find_library(CRYPTO_LIB libcrypto.a REQUIRED)
find_library(DL_LIB libdl.a REQUIRED)

message(${SODIUM_LIB})
message(${SSL_LIB})
message(${CRYPTO_LIB})

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")

target_link_libraries(
    exec
    ${SODIUM_LIB}
    ${SSL_LIB}
    ${CRYPTO_LIB}
    ${DL_LIB}
Run Code Online (Sandbox Code Playgroud)

我不希望添加-staticCMAKE_EXE_LINKER_FLAGS,因为在这种情况下,一切被链接的静态.CMake找到静态库:

/usr/local/lib/libsodium.a
/usr/lib/x86_64-linux-gnu/libssl.a
/usr/lib/x86_64-linux-gnu/libcrypto.a
Run Code Online (Sandbox Code Playgroud)

并且看起来一切都是静态链接的,除了libcrypto:

readelf -d exec
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]
Run Code Online (Sandbox Code Playgroud)

如何libcrypto静态链接到我的可执行文件?

c c++ gcc openssl cmake

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

混淆函数调用

John Viega在他的"C和C++安全编程手册"一书中提出了一种混淆函数调用的方法.它可以在这里阅读.

#define SET_FN_PTR(func, num)                  \
    static inline void *get_##func(void) { \
      int  i, j = num / 4;                 \
      long ptr = (long)func + num;         \
      for (i = 0;  i < 2;  i++) ptr -= j;  \
      return (void *)(ptr - (j * 2));      \
    }
#define GET_FN_PTR(func) get_##func(  )

#include <stdio.h>

void my_func(void) {
  printf("my_func(  ) called!\n");
}

SET_FN_PTR(my_func, 0x01301100); /* 0x01301100 is some arbitrary value */

int main(int argc, char *argv[  ]) {
  void …
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
2
解决办法
2397
查看次数

动态生成的cmake源文件列表

我们有一个代码生成器,可以将通信协议定义生成为多个c ++文件,并希望切换我们的构建系统以使用cmake.我做了一个示例项目来展示我们面临的问题.

代码生成器接收输入文件并可能生成数百个输出文件,因此枚举它们CMakeLists.txt不是一个选项,特别是因为协议在开发期间发生了变化.我们既不想使用通配符.

如果其中一个输入文件发生变化,我们没有找到让cmake重新生成makefile的方法,根据文档我们认为configure_file应该能够做到这一点,但它显然无法完成它的工作.

我们希望main每当生成器(gen在示例中的文件夹中)代码更改或协议定义文件(在我们的示例中in.txt)更新时,cmake都会重新生成主项目的makefile(在示例中的文件夹中).

我有以下文件结构:

src
??? CMakeLists.txt
??? gen
?   ??? CMakeLists.txt
?   ??? gen.cpp
??? in.txt
??? main
    ??? CMakeLists.txt
    ??? main.cpp
Run Code Online (Sandbox Code Playgroud)

具有以下内容:src/CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1)
project(cmake-config)

add_subdirectory(main)
add_subdirectory(gen)

add_dependencies(main gen run_gen)
Run Code Online (Sandbox Code Playgroud)

GEN /的CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1)
project(gen)

add_executable(gen gen.cpp)

add_custom_target(
    run_gen
    COMMAND ./gen ${CMAKE_SOURCE_DIR}/in.txt
    COMMENT running gen
)

add_dependencies(run_gen gen)
Run Code Online (Sandbox Code Playgroud)

GEN/gen.cpp:

#include <fstream>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    ifstream inf(argv[1]);
    ofstream outf("input.txt");
    string …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

6
推荐指数
1
解决办法
2983
查看次数

使用make_shared通过shared_ptr包装动态数组

我想给数组写一些字节.为了利用现代C++,我决定使用智能指针.

#include <memory>
#include <cstdint>

using namespace std;

void writeUint32_t(uint32_t value, unsigned char* p){
    *p     = static_cast<unsigned char>((value >> 24) & 0xFF);
    *(++p) = static_cast<unsigned char>((value >> 16) & 0xFF);
    *(++p) = static_cast<unsigned char>((value >>  8) & 0xFF);
    *(++p) = static_cast<unsigned char>((value      ) & 0xFF);
}

int main(){
    auto buf = make_shared<unsigned char[]>(512);
    uint32_t data = 1234;
    writeUint32_t(data, buf.get() + 8);
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下编译错误:

u.cpp:15:37: error: invalid use of array with unspecified bounds
 writeUint32_t(data, buf.get() + 8);
                                 ^
u.cpp:15:38: error: cannot …
Run Code Online (Sandbox Code Playgroud)

c++ arrays smart-pointers shared-ptr

6
推荐指数
4
解决办法
7032
查看次数

vifm:在文件列表中显示日期/时间

是否可以告诉vifm在文件列表中显示日期和时间,比如这里?当前仅显示文件大小。我也想添加日期。我找到了命令set timefmt=%m/%d\ %H:%M并将其放入 中~/.vifmrc,但仅在底部显示所选文件的日期。

linux vifm

6
推荐指数
1
解决办法
1547
查看次数

C 代码中的 Asm 变量

我正在阅读 John Viega 的 C 和 C++ 安全编程手册。有一个代码片段,我需要一些帮助来理解:

asm(".long 0xCEFAEDFE \n"
    "crc32_stored:    \n"
    ".long 0xFFFFFFFF \n"
    ".long 0xCEFAEDFE \n"
);

int main(){
    //crc32_stored used here as a variable
}
Run Code Online (Sandbox Code Playgroud)

这些行到底是什么意思:"crc32_stored:\n"".long 0xFFFFFFFF \n"?这是变量定义和初始化吗?

尝试编译书中的代码时出现以下错误:

error: ‘crc32_stored’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

c assembly

5
推荐指数
1
解决办法
350
查看次数

使用ptrace检测调试器

我试图在Linux上检测是否有调试器附加到我的二进制文件上。我找到了两种解决方案。一个简单的:

#include <stdio.h>
#include <sys/ptrace.h>

int main()
{
    if (ptrace(PTRACE_TRACEME, 0, 1, 0) == -1) 
    {
        printf("don't trace me !!\n");
        return 1;
    }
    // normal execution
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

还有一个:

#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>

int spc_detect_ptrace(void) {
  int   status, waitrc;
  pid_t child, parent;

  parent = getpid();
  if (!(child = fork())) {
    /* this is the child process */
    if (ptrace(PT_ATTACH, parent, 0, 0)) exit(1);
    do {
      waitrc = waitpid(parent, &status, …
Run Code Online (Sandbox Code Playgroud)

c dbg

5
推荐指数
1
解决办法
802
查看次数

将变量从汇编程序传递给C

#include <stdio.h>

int main(){
        __asm__ (
                "result:    \n\t"
                ".long 0    \n\t" 
                "rdtsc      \n\t"
                "movl %eax, %ecx\n\t"
                "rdtsc      \n\t"
                "subl %ecx, %eax\n\t"
                "movl %eax, result\n\t"
        );

        extern int result;
        printf("%d\n", result);
}
Run Code Online (Sandbox Code Playgroud)

我想从汇编的一些数据传递到main通过result变量.这可能吗?我的汇编代码导致了Segmentation fault (core dumped).我使用的是Ubuntu 15.10 x86_64,gcc 5.2.1.

c x86 assembly gcc inline-assembly

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

虚拟硬盘映像格式规范中的错误?

我想计算 VHD 中父定位器的结束偏移量。这是 VHD 标头的一部分:

Cookie: cxsparse
Data offset: 0xffffffffffffffff
Table offset: 0x2000
Header version: 0x00010000
Max table entries: 10240
Block size: 0x200000
Checksum: 4294956454
Parent Unique Id: 0x9678bf077e719640b55e40826ce5d178
Parent time stamp: 525527478
Reserved: 0
Parent Unicode name:
Parent locator 1:
- platform code: 0x57326b75
- platform_data_space: 4096
- platform_data_length: 86
- reserved: 0
- platform_data_offset: 0x1000
Parent locator 2:
- platform code: 0x57327275
- platform_data_space: 65536
- platform_data_length: 34
- reserved: 0
- platform_data_offset: 0xc000
Run Code Online (Sandbox Code Playgroud)

虚拟硬盘映像格式规范中的一些定义:

”Table Offset:该字段存储文件中块分配表(BAT)的绝对字节偏移量。 …

windows vhd

5
推荐指数
1
解决办法
360
查看次数

使用自己的库使用cmake进行未定义的引用

我有以下目录结构:

-project

  -helper
    -build
    -include
      -h_a.h
      -h_b.h
    -src
      -h_a
        -h_a.cpp
        -CMakeLists.txt
      -h_b
        -h_b.cpp
        -CMakeLists.txt
      -CMakeLists.txt

  -proj_c
    -build
    -src
      -main.cpp
      -CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

helper项目中生成两个库:libh_a.alibh_b.a.libh_a.a用来建立libh_b.a.文件如下:

helper/src/CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

project(helper)

set(CMAKE_CXX_FLAGS "-Wall -g -std=c++11")

add_subdirectory(h_a)
add_subdirectory(h_b)
Run Code Online (Sandbox Code Playgroud)

helper/src/h_a/CMakeLists.txt:

project(h_a)

add_library(h_a h_a.cpp)
Run Code Online (Sandbox Code Playgroud)

helper/src/h_a/h_a.cpp

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

helper/src/h_b/CMakeLists.txt:

project(h_b)

add_library(h_b h_b.cpp)

target_link_libraries(
    h_b STATIC
    h_a
)
Run Code Online (Sandbox Code Playgroud)

helper/src/h_b/h_b.cpp:

#include "../../include/h_a.h"

void func_b(){
    func_a();   
}
Run Code Online (Sandbox Code Playgroud)

proj_c/src/CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)

project(proj_c)

find_library(h_a PATHS ../../helper/build/h_a)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../helper/build/h_a)

find_library(h_b PATHS ../../helper/build/h_b)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../helper/build/h_b)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin/")

add_executable(proj_c main.cpp) …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

4
推荐指数
1
解决办法
338
查看次数

标签 统计

c ×5

c++ ×4

cmake ×3

assembly ×2

gcc ×2

arrays ×1

dbg ×1

inline-assembly ×1

linux ×1

openssl ×1

shared-ptr ×1

smart-pointers ×1

vhd ×1

vifm ×1

windows ×1

x86 ×1