【问题标题】:Turbo C++: Generate object code for malloc functionTurbo C++:为 malloc 函数生成目标代码
【发布时间】:2012-12-08 01:02:11
【问题描述】:

我使用的是 Turbo C++ 3.1。

我有一些需要 C 标准库的 malloc 的汇编模块。 所以我在我的 .asm 文件中:

extern _malloc:proc

我想生成一个包含 malloc() 的目标文件。 为了使用链接器并构建一个可执行文件。 示例:

tasm /zi bmlib.asm  // create object file: bmlib.obj
tasm /zi bmlibt.asm // create object (which contains main program): bmlibt.obj
? //Generate object file for malloc: malloc.obj
tlink /v3 bmlibt bmlib malloc // link all modules
bmlibt.exe // Execute the program 

【问题讨论】:

  • 如果你想使用运行时的malloc(),你需要链接运行时库(因为malloc()当然有它自己的依赖集)。您还需要确保正确初始化运行时。您可能会发现将汇编文件链接到一个小的 C 程序更容易,该程序除了调用汇编语言程序的入口点之外什么都不做。或者也许实现一个简单的malloc()
  • 谢谢。 C 文件提示很棒。要实现我自己的 malloc,我需要使用中断来向操作系统请求空间,对吗?
  • 这可能是一种方法。我想有一种方法可以让链接器设置 .exe 标头,以便在加载进程时有一个内存池,但是自从我使用 MS-DOS 以来已经很长时间了,所以我不能给出任何有关如何工作的详细信息。

标签: c++ c assembly linker tasm


【解决方案1】:

如果您真的希望 Turbo C++ 的 malloc 在目标文件中,您将使用 tlib 从标准库中提取该目标文件。顺便说一句,我不记得给tlib 的标志,也不记得标准库的文件名,但两者都应该很容易找到。

您实际上并不需要这样做:如果您只是在命令行上使用tcc,它会自动编译和链接您从标准库中使用过的模块。不过,您确实只需要在 C 中使用至少一个文件——malloc 取决于 C 启动代码中发生的一些初始化,因此即使您成功链接它,如果没有该启动代码,它实际上也不会工作。

【讨论】:

  • 是的,我将使用 C 文件提示。但是,我还是想学着做这一切,不需要C文件,以后会试试tlib的技巧。
  • @metroxylon:如果您想要一个可以在纯汇编中使用的标准库,您可能需要考虑Spontaneous Assembly。我在新的时候用过它——它相当很好。
【解决方案2】:

malloc() 是 C(或 C++)运行时库的一部分。您可能可以告诉链接器静态链接 C 运行时(通常称为 CRT),但通常它是动态链接的,因此可执行文件的大小更小。在任何情况下,您通常都无法选择将运行时的 malloc() 实现内置到单独的目标文件中。如果您实现自己的版本,当然,它将成为您的目标文件的一部分。在这种情况下,您的实现会覆盖系统的实现。

所以我想您应该寻找某种方法来告诉链接器您想以静态或动态方式链接到 C 运行时库。然后,当您的程序集对象文件链接到最终可执行文件时,它应该可以访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多