- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有由 NASM 创建的简单程序集文件。我想将它们与 tcc
链接。为了调试,我想在汇编代码中使用 printf()
。但是当我这样做时,tcc
失败,并显示 tcc: undefined symbol 'printf'
。
这是重现错误的最小示例代码:
extern printf
hello: db "Hello world!",0
global main
main:
push hello
call printf
pop eax
ret
控制台:
nasm -felf hello.asm
tcc hello.o
tcc: undefined symbol 'printf'
当我使用 gcc hello.o
时,一切正常,因此它必须是 tcc 特定的问题。我如何让它与 tcc 一起工作?
编辑:我正在使用 Windows 版本的 NASM 和 TCC 来生成 32 位 Windows 可执行文件。
最佳答案
看来TCC需要有关外部链接函数(例如printf
)的特定类型信息。默认情况下,NASM 在ELF 对象中创建对具有NOTYPE 属性的符号的引用。这似乎让 TCC 感到困惑,因为它似乎期望外部函数符号用 FUNCTION 类型标记。
我通过简单的C程序发现了这一点:
#include <stdio.h>
int main()
{
printf ("hello\n");
}
并将其编译为目标文件(TCC默认使用ELF对象),命令如下:
tcc -c simple.c
这会生成simple.o
。我碰巧使用 OBJDUMP 来显示汇编代码和 ELF header 。我在代码中没有看到任何异常,但标题中的符号表显示出差异。如果您使用程序READELF,您可以获得符号的详细转储。
readelf -s simple.o
Symbol table '.symtab' contains 5 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS simple.c
2: 00000000 7 OBJECT LOCAL DEFAULT 2 L.0
3: 00000000 26 FUNC GLOBAL DEFAULT 1 main
4: 00000000 0 FUNC GLOBAL DEFAULT UND printf
特别令人感兴趣的是 printf
的符号表条目:
4: 00000000 0 FUNC GLOBAL DEFAULT UND printf
如果您要转储 hello.o
对象的 ELF header ,您会看到类似于以下内容的内容:
readelf -s hello.o
Symbol table '.symtab' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS hello.asm
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 NOTYPE LOCAL DEFAULT 1 hello
4: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf
5: 0000000d 0 NOTYPE GLOBAL DEFAULT 1 main
请注意 hello.o
中的符号 printf
与上面 simple.o
中的符号有何不同。 NASM 默认使用 NOTYPE 属性而不是 FUNCTION 定义标签。
我不知道有什么方法可以解决NASM中的问题,因为我不知道如何强制它使用FUNCTION类型而不是< em>NOTYPE 位于定义为 extern
的符号上。我在十六进制编辑器中更改了类型,它按预期链接并运行。
另一种选择是download YASM (NASM 的重写)。对于大部分部分来说,NASM 和YASM 的工作方式相同。 YASM 的命令行大部分与 NASM 兼容,因此您应该能够使用它作为直接替代品。 YASM 有一个额外的功能,允许您使用 type
directive 指定符号的类型。 :
9.3.3. TYPE: Set symbol type
ELF’s symbol table has the capability of indicating whether a symbol is a
function or data. While this can be specified directly in the GLOBAL
directive (see Section 9.4), the TYPE directive allows specifying the
symbol type for any symbol, including local symbols.
The directive takes two parameters; the first parameter is the symbol
name, and the second is the symbol type. The symbol type must be either
function or object. An unrecognized type will cause a warning to be
generated. Example of use:
func:
ret
type func function
section .data
var dd 4
type var object
您只需为您使用的每个外部函数在汇编代码中添加一行额外的类型信息。您的汇编代码可以修改为如下所示:
extern printf
type printf function
hello: db "Hello world!",0
global main
main:
push hello
call printf
pop eax
ret
它应该编译并链接如下:
yasm -felf hello.asm -o hello.o
tcc hello.o -o hello.exe
关于c - tcc:在汇编代码中使用 C 标准函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920355/
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下: (1) The restrictions of standard I/O Restricti
似乎是一个足够标准的问题,可以保证解决方案中的标准设计: 假设我想在文件中写入 x+2(或更少)个字符串。 x 字符串构成一个部分的内容,这两个字符串构成该部分的页眉和页脚。要注意的是,如果内容中没有
代码版本管理 在项目中,代码的版本管理非常重要。每个需求版本的代码开发在版本控制里都应该经过以下几个步骤。 在master分支中拉取该需求版本的两个分支,一个feature分支,
我有以下sql查询,我需要获取相应的hibernate条件查询 SELECT COUNT(DISTINCT employee_id) FROM erp_hr_payment WHERE payment
所以我正在编写一些代码,并且最近遇到了实现一些 mixin 的需要。我的问题是,设计混音的正确方法是什么?我将使用下面的示例代码来说明我的确切查询。 class Projectile(Movable,
我的环境变量包含如下双引号: $echo $CONNECT_SASL_JAAS_CONFIG org.apache.kafka.common.security.plain.PlainLoginModu
示例: /** * This function will determine whether or not one string starts with another string. * @pa
有没有办法在 Grails 中做一个不区分大小写的 in 子句? 我有这个: "in"("name", filters.tags) 我希望它忽略大小写。我想我可以做一个 sqlRestriction
我搜索了很长时间,以查找将哪些boost库添加到std库中,但是我只找到了一个新库的完整列表(如此处:http://open-std.org/jtc1/sc22/wg21/docs/library_t
我已经通过使用这个肮脏的黑客解决了我的问题: ' Filter managerial functions ActiveSheet.Range("$A$1:$BW$2211").Auto
因此,我很难理解我需要遵循的标准,以便我的 Java 程序能够嵌入 HTML。我是否只需将我的主类扩展到 Applet 类,或者我还需要做更多的事情吗?另外,在我见过的每个 Applet 示例中,它都
我对在 Hibernate 中使用限制有疑问。 我必须创建条件,设置一些限制,然后选择日期字段最大值的记录: Criteria query = session.createCriteria(Stora
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我很难编写条件来选择所有子集合或孙集合为空的实体。我可以将这些作为单独的条件来执行,但我无法将其组合成一个条件。 类结构: public class Component { p
@Entity class A { @ManyToMany private List list; ... } @Entity class B { ... } 我想使用条件(不是 sql 查询)从 A
我的数据库中有以下表结构: Table A: Table B: Table C: _______________
请帮助我: 我有下一张 table : 单位 ID 姓名 用户 ID 姓名 利率 单位 ID 用户 ID 我不明白如何从 SQL 创建正确的条件结构: 代码: SELECT * FROM Unit W
我正在构建一个包含项目的网站,每个项目都有一个页面,例如: website.com/book/123 website.com/film/456 website.com/game/789 每个项目都可以
我需要使用两个属性的组合来过滤结果列表。一个简单的 SQL 语句如下所示: SELECT TOP 10 * FROM Person WHERE FirstName + ' ' + LastName L
我有一个“ super 实体”SuperEntity 和三个扩展父类(super class)的实体 ChildEntity1、...、ChildEntity3。 搜索数据库中的所有实体很容易,即我们
我是一名优秀的程序员,十分优秀!