我想静态链接下面列出的库:
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)
我不希望添加-static到CMAKE_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静态链接到我的可执行文件?
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 ++文件,并希望切换我们的构建系统以使用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++,我决定使用智能指针.
#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) 是否可以告诉vifm在文件列表中显示日期和时间,比如这里?当前仅显示文件大小。我也想添加日期。我找到了命令set timefmt=%m/%d\ %H:%M并将其放入 中~/.vifmrc,但仅在底部显示所选文件的日期。
我正在阅读 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) 我试图在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) #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.
我想计算 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)的绝对字节偏移量。 …
我有以下目录结构:
-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.a和libh_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)