小编Mat*_*son的帖子

使用 dlinfo 打印库中的所有符号

我有一个使用 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)

c dlopen

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

运行并杀死Selenium Server Singleton进程,持续C#DLL生存期

我有一个Selenium测试.DLL加载使用NUnit.

我运行所需的硒Java服务器悄悄藏在一个进程中运行测试时.

不过,我目前启动服务器测试开始Kill()的当测试停止.

这导致每个测试启动/停止 selenium服务器.


我想要的是Selenium Server进程:

  • 开始在任DLL加载/初始化第一次测试开始时
  • 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)

singleton selenium process selenium-rc

3
推荐指数
1
解决办法
3646
查看次数

dlopen() .so 无法在剥离的可执行文件中找到符号

我在 linux 中有一个可执行文件 - exe

这个可执行文件中有一些函数,在整个代码中使用:

  • sendMsg
  • debugPrint

然后我想动态加载一个.so为我的可执行文件提供额外功能的文件。

在这个共享库中,我包含了sendMsg和的头文件debugPrint

我加载这个共享库dlopen()并使用dlsym().

但是,在dlopen()我用来RTLD_NOW在加载时解析所有符号。

它没有说明它找不到sendMsg符号。

这个符号必须在可执行文件中,因为sendMsg.c是在那里编译的。

但是,我的可执行文件被make进程剥离了。因此,dlopen找不到符号是有道理的。

我该如何解决这种情况?

  • 我可以建立共享的功能集成到一个静态库和链接,静态库到两个exe.so。这会增加代码大小:(
  • 我可以删除剥离exe以便可以找到符号
  • 做一些我不知道的编译时链接魔术,所以.so知道符号在哪里exe

linux dynamic-linking dynamic-loading

3
推荐指数
1
解决办法
3189
查看次数

为什么glibc中strcpy的性能更差?

我正在阅读源代码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)

c performance glibc

3
推荐指数
1
解决办法
2821
查看次数

在单个数组对象上覆盖toString()Javascript

我有以下内容:

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)

因为它会覆盖所有要替换的数组,用.?

javascript overloading jslint

3
推荐指数
1
解决办法
3775
查看次数

带有所有已加载库的GetProcAddress

有了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)

c c++ dll winapi

3
推荐指数
1
解决办法
1275
查看次数

gcc 4.9.0不接受std :: unique_ptr <void>

所以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)

c++ c++11

3
推荐指数
1
解决办法
578
查看次数

Makefile - 将多个文件夹中的头文件复制到一个包含依赖项的文件夹中

我在不同的文件夹中有多个文件,我需要将它们复制到一个包含文件夹中:

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 变量列表 - 有谁知道如何依次复制所有文件?

谢谢

马特

makefile

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

Ant构建目标以列出自己的构建目标

我是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或 …

ant

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

初始化为同一个变量

我刚在单元测试代码中发现这是一个错误类型:

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)

用gcc 4.8编译

c++

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