我看到我认为Microsoft Visual Studio 2003工具输出的目标文件的奇怪行为.该file实用程序告诉我:
asmfile.obj: 80386 COFF executable not stripped - version 30821
Run Code Online (Sandbox Code Playgroud)
对于汇编程序创建的对象,但对于来自C文件的对象,我只得到:
cfile.obj: data
Run Code Online (Sandbox Code Playgroud)
使用Microsoft的dumpbin实用程序和objdump我从cygwin获得的,我可以反汇编程序集生成的文件,但是我从C-built文件的任一实用程序中都得不到有用的结果.
我有几个与这种差异有关的问题:
我对使用AT&T语法进行反汇编特别感兴趣 - 我正在做一个大型源代码库的端口以使其与GCC一起工作,我想使用此方法作为一些内联汇编例程的快捷方式.项目.
编辑:添加更多信息.
当我dumpbin在其中一个文件上运行时,没有给出任何结果:
C:\> dumpbin /disasm Func.obj
Microsoft (R) COFF/PE Dumper Version 7.10.6030
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file Func.obj
FileType: ANONYMOUS OBJECT
Run Code Online (Sandbox Code Playgroud)
有objdump,它给出:
$ objdump -d Func.obj
objdump: Func.obj: File truncated
Run Code Online (Sandbox Code Playgroud)
关于从汇编构建的文件,我得到了合理的结果.
再次编辑:添加命令行信息.
汇编文件使用类似于以下内容的命令行构建:
ml -nologo -W3 -WX -c -coff -FoAssemblyFile.obj -Zi -Cx …Run Code Online (Sandbox Code Playgroud) 主要问题:为什么一般甚至专业的整体计划优化者都不是我们日常生活的一部分?
我开始思考这个阅读SuperCompilers后,LLC的白皮书,其中讨论了他们的"supercompiling"或方法metacompiling程序的源(通常情况下)实现了更快的版本,做相同的功能原来的程序.基本上,他们逐步执行程序并重新编译为相同的目标语言.通过这样做,自然优化发生; 例如,如果输入程序经常使用100个项目的数组,则通用二进制搜索功能可能专门用于二进制搜索100个项目的数组.
部分求值是一个或许更窄的类型整个程序优化,其中该程序的源减少/同时留下未知的输入开在运行时评估基于一些组固定输入的评估的.例如,如果给定y = 5,则一般函数x ^ y可以减少到x ^ 5或者可能是(x*x)*(x*x)*x.
(我为这两种技术的粗略描述道歉)
从历史上看整个程序的优化,如上述两个就太内存密集型执行,而是用我们的机器已经的内存(或者使用类似云)演出,为什么没有我们看到许多开源部分评估和如春吗?我见过一些,但我认为这将成为我们工具链的常规部分.
我有一组同类策略类,我想将它们作为策略传递给模板类PolicyDrivenClass,它采用一些未知数量的策略模板参数.
每个策略都实现了一个"名称"功能,我希望能够通过PolicyDriveClass :: getNames在运行时查询所有策略的名称.
我有一个工作实现,但它感觉笨重,特别是考虑到在我的最终设计中,Policy类将实现类似于"name"的几个函数,尽管可能具有不同的返回类型,并且我的Policy Driven Class将希望提供类似的访问器每个功能的"getNames".
我的问题是,是否有人能够为此提出更好的实施方案.
为什么它值得我使用clang ++.我的g ++版本不喜欢这个.
这是我到目前为止所拥有的:
#include <string>
#include <deque>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;
template<typename... Policies>
class PolicyDrivenClass
{
public:
template<typename T, typename... Types>
class NameExtractor
{
public:
static deque<string> getNames()
{
deque<string> names = NameExtractor<Types...>::getNames();
names.push_front(T::name());
return names;
}
};
template<typename T>
class NameExtractor<T>
{
public:
static deque<string> getNames()
{
deque<string> ret;
ret.push_back(T::name());
return ret;
}
};
deque<string> getNames() const
{
return NameExtractor<Policies...>().getNames();
}
};
class Policy1
{ …Run Code Online (Sandbox Code Playgroud) 我试图覆盖抽象基类的所有方法,但我没有得到看起来的所有方法。
我使用 msbuild 构建项目,该项目是由 cmake 生成的。
MSVC++ 2012 编译器抱怨错误error C2259: 'Derived' : cannot instantiate abstract class。
所以问题是,如何强制编译器告诉我缺少的方法名称,该类不再是抽象的(并且所有方法都已指定)?
我在主机上有一个向量,我想将它减半并发送到设备.做一个基准测试表明它CL_MEM_ALLOC_HOST_PTR比CL_MEM_USE_HOST_PTR速度更快,速度更快CL_MEM_COPY_HOST_PTR.此外,设备上的内存分析不会显示设备上创建的缓冲区大小有任何差异.这与Khronos-clCreateBuffer上提到的标志的文档不同.有谁知道发生了什么?
我正在写一个内核模块,我需要劫持/包装一些sys调用.我蛮力强制sys_call_table地址,我正在使用cr0来禁用/启用页面保护.到目前为止一切都很好(一旦完成,我会公开整个代码,所以如果有人想要我可以更新这个问题).
无论如何,我注意到如果我劫持__NR_sys_read我在卸载内核模块时会得到内核oops,并且所有konsoles(KDE)都会崩溃.请注意,这不会发生__NR_sys_open或__NR_sys_write.
我想知道为什么会这样.有任何想法吗?
PS:请不要采用KProbes方式,我已经了解它并且我不可能使用它,因为最终产品应该可以使用而无需重新编译整个内核.
编辑 :(添加信息)
我在卸载前恢复原来的功能.另外,我创建了两个测试用例,一个_write只有一个,一个有_read.一个_write卸载很好,但_read卸载然后崩溃的内核).
编辑 :(源代码)
我目前在家,因此我现在无法发布源代码,但如果有人想要,我可以在我上班后立即发布示例代码.(~5小时)
我喜欢使用 Nim 读取文本文件的全部内容。
我试过
let fileContent: string = readAll("file.txt")
Run Code Online (Sandbox Code Playgroud)
但这不能编译。
考虑我有以下课程:
/// File classes.d
class C {
string type() { return "C"; };
}
class C1 : C {
override string type() { return "C1"; };
}
class C2 : C {
override string type() { return "C1"; };
}
Run Code Online (Sandbox Code Playgroud)
现在我想在其他地方实施工厂,例如:
/// File factory.d
module factory;
import std.functional;
import std.stdio;
void main() {
mixin(import("classes.d"));
auto c = cast(typeof(mixin("C1"))) Object.factory("C1");
writeln(c.type());
}
Run Code Online (Sandbox Code Playgroud)
编译器(dmd 2.058)说:
factory.d(7): Error argument C1 to typeof is not an expression
Run Code Online (Sandbox Code Playgroud)
我知道以下行汇编得很好:
auto c = cast(C1) Object.factory("classes.C1");
Run Code Online (Sandbox Code Playgroud)
但这需要我在编译时知道类型(C1).我想在运行时获取类型(如字符串).
当我在网上浏览时,似乎更常使用Detector.js,但我发现还有缩小的system.min.js文件:https://github.com/mrdoob/system.js
这可能是微不足道的,但我想知道哪个是合适的,以及为什么大多数人似乎都在使用Detector(至少从我看过).他们似乎都做了这项任务.
是否有可能指定必须使用接口实现方法的真实接口?`或者这是如何工作的我想要的:
public interface IGraph
{
void addEdge(IGraphVertex a, IGraphVertex b);
}
public interface IGraphVertex
{
}
// problematic code
public class Graph2d : IGraph
{
public void addEdge(Graph2dVertex a, Graph2dVertex b)
{
}
}
public class Graph2dVertex : IGraphVertex
{
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是Graph2d没有实现 addVertex(IGraphVertex a, IGraphVertex b);
c ×2
c++ ×2
c# ×1
c++11 ×1
coff ×1
d ×1
disassembly ×1
factory ×1
inheritance ×1
javascript ×1
kernel ×1
linux ×1
mixins ×1
nim-lang ×1
object-files ×1
opencl ×1
optimization ×1
system-calls ×1
templates ×1
three.js ×1