我有一个使用 dlopen 加载库的 C++ 类。作为练习,我试图从加载的库中转储所有符号名称。
我曾经dlinfo通过RTDL_DI_LINKMAP以下方式加载链接图:
struct link_map
{
ElfW(Addr) l_addr; /* Base address shared object is loaded at. */
char *l_name; /* Absolute file name object was found in. */
ElfW(Dyn) *l_ld; /* Dynamic section of the shared object. */
struct link_map *l_next, *l_prev; /* Chain of loaded objects. */
};
Run Code Online (Sandbox Code Playgroud)
这为我提供了dlopen调用已加载的库的链接列表。然后我想我可以处理l_ld动态部分,获取符号查找表并找到所有符号名称。但是,我无法弄清楚应该如何使用动态SYMTAB部分。DT_SYMTAB将 a转换为 aElfW(Sym)似乎没有任何结果。还有什么SYMTAB指点?我有一个不好的抵消?我已经在下面列出了到目前为止我所到之处。
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include …Run Code Online (Sandbox Code Playgroud) 我有一个Selenium测试.DLL被加载使用NUnit.
我运行所需的硒Java服务器悄悄藏在一个进程中运行测试时.
不过,我目前启动服务器当测试开始和Kill()它的当测试停止.
这导致每个测试启动/停止 selenium服务器.
我想要的是Selenium Server进程:
Kill()编上DLL死亡或垃圾收集
我读到C#不支持捕获DLL初始化和调用代码.(我错了吗?)
我的想法是将Selenium服务器托管在单例类中,并在第一次测试运行时对其进行初始化.然后我将它留给垃圾收集器通过解构器调用Dispose方法.我目前有以下代码来托管selenium服务器:
namespace Tests.Server
{
using System;
using System.Diagnostics;
using System.IO;
using System.Security;
using System.Windows.Forms;
using Microsoft.Win32;
/// <summary>
/// A singleton class to host and control the selenium server.
/// </summary>
public class SeleniumServer : IDisposable
{
#region Fields
/// <summary>
/// …Run Code Online (Sandbox Code Playgroud) 我在 linux 中有一个可执行文件 - exe
这个可执行文件中有一些函数,在整个代码中使用:
sendMsgdebugPrint然后我想动态加载一个.so为我的可执行文件提供额外功能的文件。
在这个共享库中,我包含了sendMsg和的头文件debugPrint。
我加载这个共享库dlopen()并使用dlsym().
但是,在dlopen()我用来RTLD_NOW在加载时解析所有符号。
它没有说明它找不到sendMsg符号。
这个符号必须在可执行文件中,因为sendMsg.c是在那里编译的。
但是,我的可执行文件被make进程剥离了。因此,dlopen找不到符号是有道理的。
我该如何解决这种情况?
exe及.so。这会增加代码大小:(exe以便可以找到符号.so知道符号在哪里exe我正在阅读源代码glibc2.9.阅读该strcpy函数的源代码,性能不如我预期的那么好.
以下是strcpyin 的源代码glibc2.9:
char * strcpy (char *dest, const char* src)
{
reg_char c;
char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
size_t n;
do {
c = *s++;
s[off] = c;
}
while (c != '\0');
n = s - src;
(void) CHECK_BOUNDS_HIGH (src + n);
(void) CHECK_BOUNDS_HIGH (dest + n);
return dest;
}
Run Code Online (Sandbox Code Playgroud)
因为我不知道使用偏移量的原因,所以我通过将上面的代码与以下代码进行比较来进行一些性能测试:
char* my_strcpy(char *dest, const char *src) …Run Code Online (Sandbox Code Playgroud) 我有以下内容:
var version = [0,3,0];
// Override the version toString method.
version.__proto__.toString = function() {
return this.join('.');
};
Run Code Online (Sandbox Code Playgroud)
以下是哪一项
version.toString => '0.3.0'
Run Code Online (Sandbox Code Playgroud)
JSlint呻吟这__proto__是一个保留名称 - 这是正确的.
我认为我的输错不正确.
我不想
Array.prototype.toString
Run Code Online (Sandbox Code Playgroud)
因为它会覆盖所有要替换的数组,用.?
有了dlopen你能提供NULL的库名,并获得一个句柄,可以让你找到一个符号在任何加载的库:
如果filename是NULL指针,则返回的句柄用于主程序.当给予dlsym()时,此句柄会导致在主程序中搜索符号,然后搜索程序启动时加载的所有共享库,然后由dlopen()加载标记为RTLD_GLOBAL的所有共享库.
你可以这样做GetProcAddress吗?我想搜索Windows API的存在,但在Windows 8中加载了不同的库.
我知道通过查看COFF标头加载了哪些库,我想我可以在那里循环处理...
这是我目前正在使用的代码:
.hpp
#include <string>
#include <stdexcept>
/**
* @~english
* Looks up a Windows API function. Make sure you set @c _WIN32_WINNT so that the definition is available at compile
* time.
* @par Example
* @code
* # undef _WIN32_WINNT
* # define _WIN32_WINNT 0x600
* # include <system/inc/nt/windows.h>
* static const auto initialize_srw_lock_ptr = FunctionPtrLookup(InitializeSRWLock, "kernel32");
* @endcode
* @param function the function definition …Run Code Online (Sandbox Code Playgroud) 所以gcc 4.9.0已实现一个static_assert离子该类型是不void被正确地符合标准.这很棒,一切都符合标准.
我有一个变体类型存储数据下std::unique_ptr<void>现在不起作用.简单的解决方法是将其更改为a std::shared_ptr<void>并立即编译.更好的解决方法是提供删除函数.
以下是一种安全的修复方法unique_ptr吗?这会表现出某些多态类型的未定义行为吗?
#include <memory>
#include <iostream>
template<typename T>
void Deleter(void * p) {
delete reinterpret_cast<T*>(p);
}
int main() {
const std::unique_ptr<void, void(*)(void*)> v(new int(199), Deleter<int>);
std::cout << *reinterpret_cast<int*>(v.get()) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在不同的文件夹中有多个文件,我需要将它们复制到一个包含文件夹中:
前 make
../security/security_features.h
../this/this_features.h
[etc]
../that/that_features.h
Run Code Online (Sandbox Code Playgroud)
后 make
./include/security_features.h
./include/this_features.h
[etc]
./include/that_features.h
Run Code Online (Sandbox Code Playgroud)
./include 文件夹中的文件都需要依赖各个文件夹中的文件。
Makefile 对我来说有点神秘,我尝试阅读手册并了解如何创建依赖项:
./include/security_features.h: ../security/security_features.h
@cp -av $< $@
Run Code Online (Sandbox Code Playgroud)
但是我必须对我的所有文件都这样做 - 还有另一种更优雅的方式吗?
理想情况下,我只想编写分散文件夹中各种文件的 Makefile 变量,并且 makefile 知道将该变量中的所有文件复制到包含文件夹中。
有没有 Makefile 大师?
谢谢,
马特
我已经设法做这样的文件列表:
INCLUDES_SRC := ../security/security_features.h ../this/this_features.h
INCLUDES_DST := $(addprefix ./include/,$(notdir $(INCLUDES_SRC)))
Run Code Online (Sandbox Code Playgroud)
并且可以使一个依赖于另一个:
$(INCLUDES_DST): $(INCLUDES_SRC)
@cp -av $< $@
Run Code Online (Sandbox Code Playgroud)
然而,这只是将第一个先决条件 ( ../security/security_features.h) 两次复制到两个目标 ( ./include/security_features.h, ./include/this_features.h):
'../security/security_features.h' -> './include/security_features.h'
'../security/security_features.h' -> './include/this_features.h'
Run Code Online (Sandbox Code Playgroud)
所以我现在有一个文件的 src 和目标位置的 make 变量列表 - 有谁知道如何依次复制所有文件?
谢谢
马特
我是Ant的新手.我想要以下内容:
<target name="targets" description "Lists Targets">
[some Ant code/tasks]
</target
Run Code Online (Sandbox Code Playgroud)
当我打电话时,ant targets我希望Ant搜索Ant正在为其所有目标运行的当前文件
<target name="all" depends="doc,sca,compile,test" description="Complete build">
</target>
Run Code Online (Sandbox Code Playgroud)
并输出
[echo] all - Complete Build - Depends on: doc, sca, compile, test
[echo] doc - Builds documentation
[echo] compile - Compiles files
[echo] sca - Performs static code analysis
[echo] test - Runs unit tests - Depends on: compile
[echo] clean - Cleans a build
[echo] install - Performs an installation
[echo] targets - Lists Targets
Run Code Online (Sandbox Code Playgroud)
在Bash或 …
我刚在单元测试代码中发现这是一个错误类型:
Binding binding(x, y, z);
Binding moved(std::move(moved)); // Should be `std::move(binding)`
Run Code Online (Sandbox Code Playgroud)
为什么这个有效的代码?这里发生了什么?这不应该是一个错误吗?
#include <string>
#include <iostream>
int main() {
std::string x(std::move(x));
std::cout << '"' << x << '"' << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
c ×3
c++ ×3
ant ×1
c++11 ×1
dll ×1
dlopen ×1
glibc ×1
javascript ×1
jslint ×1
linux ×1
makefile ×1
overloading ×1
performance ×1
process ×1
selenium ×1
selenium-rc ×1
singleton ×1
winapi ×1